mongoDB オブジェクトの配列に条件を指定して抽出する

mongoDB オブジェクトの配列に条件を指定して抽出する

mongoDBで、オブジェクトの配列に条件を指定して抽出する手順を記述してます。「find」に「$all」と「$elemMatch」を使用して条件を指定いきます。

環境

  • OS CentOS Stream release 9
  • MongoDB 6.0.2

手順

オブジェクトの配列に条件を指定して抽出するには、「$all」と「$elemMatch」を使用します。

db.コレクション名.find( { $all: [{$elemMatch:{条件}}] } )

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

> use hoge

> db.bar.find()

[
  {
    _id: ObjectId("63636f6eaa99398cb1bcb91f"),
    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("63636f84aa99398cb1bcb921"),
    name: 'bar2',
    tags: [ 'tai', 'b' ],
    qty: [ { size: 'M', num: 15, color: 'red' } ]
  },
  {
    _id: ObjectId("63636f91aa99398cb1bcb923"),
    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("63636fa9aa99398cb1bcb925"),
    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( {     
    qty: { 
        $all: [         
            { $elemMatch : { size: "M", num: { $gt: 50} } },
            { $elemMatch : { num : 100, color: "green" } }
            ] 
        } 
} )

[
  {
    _id: ObjectId("63636f6eaa99398cb1bcb91f"),
    name: 'bar1',
    tags: [ 'japan', 'a' ],
    qty: [
      { size: 'S', num: 10, color: 'blue' },
      { size: 'M', num: 100, color: 'blue' },
      { size: 'L', num: 100, color: 'green' }
    ]
  }
]

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

and条件も使用できます。

> db.bar.find({ $and: [{tags:"usa"},{tags:"c"}] })

[
  {
    _id: ObjectId("63636f91aa99398cb1bcb923"),
    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("63636fa9aa99398cb1bcb925"),
    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' }
    ]
  }
]

抽出されていることが確認できます。