mongoDB 指定したデータ数の配列があるドキュメントを取得する

mongoDB 指定したデータ数の配列があるドキュメントを取得する

mongoDBで、指定したデータ数の配列があるドキュメントを取得する手順を記述してます。「$size」に取得したいデータ数を指定刷ることで可能です。実際に実行した結果も記載してます。

環境

  • OS CentOS Stream release 9
  • MongoDB 6.0.2

手順

指定したデータ数の配列があるドキュメントを取得するには、「$size」を使用します。

db.コレクション名.find( {フィールド名:{ $size: 数値 }} )

実際に、以下のデータベース「hoge」にある「bar」というコレクション(テーブル)のドキュメント(レコード)を使用して動作を確認してみます。

> use hoge

> db.bar.find()

[
  {
    _id: ObjectId("6396e5a7c914f06e4f31575e"),
    name: 'bar1',
    tags: [ 'japan', 'a' ],
    qty: [
      { size: 'S', num: 10, color: 'blue' },
      { size: 'M', num: 100, color: 'blue' },
      { size: 'L', num: 100, color: 'green' }
    ]
  },
  {
    _id: ObjectId("6396e640c914f06e4f31575f"),
    name: 'bar2',
    tags: [ 'tai', 'b' ],
    qty: [ { size: 'M', num: 15, color: 'red' } ]
  },
  {
    _id: ObjectId("6396e667c914f06e4f315760"),
    name: 'bar3',
    tags: [ 'usa', 'c' ],
    qty: [
      { size: 'M', num: 20, color: 'red' },
      { size: 'LL', num: 200, color: 'yellow' },
      { size: 'XL', num: 250, color: 'blue' }
    ]
  },
  {
    _id: ObjectId("6396e6cac914f06e4f315761"),
    name: 'bar3',
    tags: [ 'usa', 'c', 'canada' ],
    qty: [
      { size: 'M', num: 20, color: 'red' },
      { size: 'LL', num: 200, color: 'yellow' },
      { size: 'XL', num: 250, color: 'blue' }
    ]
  }
]

「tags」の配列データが3のものを抽出してみます。

> db.bar.find( {tags: { $size:3 }})
[
  {
    _id: ObjectId("6396e6cac914f06e4f315761"),
    name: 'bar3',
    tags: [ 'usa', 'c', 'canada' ],
    qty: [
      { size: 'M', num: 20, color: 'red' },
      { size: 'LL', num: 200, color: 'yellow' },
      { size: 'XL', num: 250, color: 'blue' }
    ]
  }
]

取得されていることが、確認できます。

マイナス値や文字列を指定するとエラーとなります。

> db.bar.find( {tags: { $size:-1 }})
MongoServerError: Failed to parse $size. Expected a non-negative number in: $size: -1

> db.bar.find( {tags: { $size:"3" }})
MongoServerError: Failed to parse $size. Expected a number in: $size: "3"

mongo5の場合は、以下のエラーとなります。

> db.bar.find( {tags: { $size:-1 }})

Error: error: {
        "ok" : 0,
        "errmsg" : "$size may not be negative",
        "code" : 2,
        "codeName" : "BadValue"
}

> db.bar.find( {tags: { $size:"3" }})
Error: error: {
        "ok" : 0,
        "errmsg" : "$size needs a number",
        "code" : 2,
        "codeName" : "BadValue"
}