[mongo]配列カラム内の連想配列の複数条件一致検索

はまったのでメモ

[{
id:1,
name:"A class",
array_data:[
    {age:17, sex:"f", height:160, wight:40},
    {age:18, sex:"f", height:150, wight:35},
    {age:19, sex:"f", height:170, wight:45}
  ]
},
{
id:2,
name:"B class",
array_data:[
    {age:17, sex:"m", height:160, wight:50},
    {age:18, sex:"m", height:150, wight:55},
    {age:19, sex:"m", height:170, wight:65}
  ]
}
]

上記のようなデータが存在した場合に
array_dataカラムの配列中にage=18 且つ sex=”m”のある行のデータだけ
取得したい場合の書き方を下記に記述します。

db.hoge.find({
  "array_data.age":18,
  "array_data.sex":"m",
  $where: function(){
    var arr = this.array_data;
    for (var i in arr) {
      if (arr[i].age==18 && arr[i].sex == "m"){
        return true;
      }
    }
   return false;
  }
});

結果はid:2の行のみを取得できます。
※$whereのスクリプトを書かないとid:1も対象として取得されます。

また、phpでも上記$where部分を書けば思った通りのデータ行が取得できます。
更にarray_data内の該当行のみを取得する場合は、
プログラムで該当の連想配列行を取得する必要があります。

記憶を辿り書いてしまっているので誤って書いている部分があるかもしれまん、、

スポンサーリンク