[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内の該当行のみを取得する場合は、
プログラムで該当の連想配列行を取得する必要があります。

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

スポンサーリンク

[mongo]bigintその2[php]

ここに64bitならmongo.native_longをtrueにすればいい的なことが書かれている・・・
mongo.types

実際にinsertした値をコンソールで確認すると、new MongoInt64でinsertしたときと同じものが入っていた・・・

スポンサーリンク

[メモ]PHPからmongoDBへbigintのinsertの仕方

またしても、私的メモです。

こちらのマニュアル通りこれを使うとbigintが入ります・・・
mongoInt64

■insertの仕方

//接続
$obj_connection = new Mongo();
//db選択
$db = $obj_connection->hoge_db;
//collection選択
$collection = $db->hoge_collection;
$collection->insert(array("id"=>new MongoInt64(220309509225197578)));

・コンソールでinsertされた値をみてみると以下の様に入っていることがわかる。
“id” : NumberLong(“220309509225197578”)

追記:
phpでの取得の仕方

//接続
$obj_connection = new Mongo();
//db選択
$db = $obj_connection->hoge_db;
//collection選択
$collection = $db->hoge_collection;
$collection->find(array("id"=>aray('$gt'=>new MongoInt64(220309509225197578))));

スポンサーリンク

[メモ]mongodb:配列内の値での絞り込みの仕方

完全に自分用メモです。

mongoDBで配列内の値をキーにどうやって絞り込むか解らなかったので、調べました。
※実際に値を作ってクエリー投げてみて確認しました。

基本的にはここにすべて書かれています。
高度なクエリー-配列内の値

自分が適当に検証したのは・・

[user@servername ~]$ mongo test_db
> db.test_collection.save({a:1});
> db.test_collection.save({a:2});
> db.test_collection.save({a:3});
> db.test_collection.save({a:4});
> db.test_collection.save({a:5});
> db.test_collection.save({a:6});
> db.test_collection.save({a:7,b:[{b1:"b1_1",b2:"b1_2"},{b1:"b2_1",b2:"b2_2"}]});
> db.test_collection.save({a:8,b:[{b1:"b1_2",b2:"b1_3"},{b1:"b2_2",b2:"b2_3"}]});
> db.test_colection.find({b:{$elemMatch:{b1:"b1_1"}}});
{ "_id" : ObjectId("4febdcb92cd09b7bd6abce80"), "a" : 7, "b" : [ { "b1" : "b1_1", "b2" : "b1_2" }, { "b1" : "b2_1", "b2" : "b2_2" } ] }
>

これで見事に取得できている。。
db.test_colection.find({b:{$elemMatch:{b1:”b1_1″}}});
(結局$elemMatchを使えばよいということらしい。)

これでやっと、一つわからない部分が解決した。。
長かったなぁ・・・

スポンサーリンク