3

私のMongoDBドキュメントの構造体があります:

{
    _id : "12345",
    name : "foo",
    object : {
        array_of_objects : [{
            id : 507,
            name : "some name",
            dt : "2012-06-27 16:35:50"
        },{
            id : 506
            name : "some other name",
            dt : "2012-06-21 16:09:05"
        },
        …
        ]
    }
}

指定された名前のドキュメントの特定のIDを持つarray_of_objectsからオブジェクトを取得する必要があります。私はphpを使用して、次のコードを実行しようとしました:

$collection->find(array('name' => 'foo', 'object.array_of_objects.id' => 507));

ID 507の要素ではなく、 array_of_objectsのすべての要素を返します。その後、$elemMatchを使用してクエリを実行しようとします。

$collection->find(array('name' => 'foo', 'object.array_of_objects' => array('$elemMatch' => array('id' => 507))));

しかし、それは同じように戻ってきました。:(私のMongoDBバージョン2.0.6。助けてください。

4

3 に答える 3

3

この問題は解決されており、次の安定版リリースである MongoDB バージョン 2.2 で利用できるようになります: https://jira.mongodb.org/browse/SERVER-828

MongoDB 2.1.2 (不安定、開発リリース) を使用して試してみました。

サンプル ドキュメント:

{ "_id" : 1, "object" : { "array" : [ { "id" : 507, "name" : "Jenna" }, { "id" : 506, "name" : "Matt" } ] } } 

クエリ:

db.food.find({_id:1, "object.array.id":506},{_id:0, "object.array.$":1})

結果:

{ "object" : { "array" : [ { "id" : 506, "name" : "Matt" } ] } }
于 2012-06-28T19:27:31.637 に答える
0

MongoDBではこれを行うことはできません。たとえば、MongoDBは特定のドキュメントにドリルダウンして配列からアイテムを抽出することはありません。これは、自分で行う必要があります。

これで、PHPドライバーがより多くの作業を実行する可能性がありますが、わかりません。MongoDBコアクエリについて話しています。

于 2012-06-28T18:03:53.710 に答える
0

というわけでMapReduceでやってみました。うまくいけば、これは誰かの時間と神経を節約します。

$name = 'foo';
$id = 507;

$mongo = new Mongo('…');

$db = $mongo->my_db;

$map = new MongoCode('function(){'.
    'this.object.array_of_objects.forEach(function(obj){'.
        'if (obj.id == '.$id.')'.
            'emit(1, obj);'.
    '});}'
);

$reduce = new MongoCode('function(k,v){ return [k,v]; }');

$response = $db->command(array(
    'mapreduce' => 'my_collection', 
    'map' => $map,
    'reduce' => $reduce,
    'query' => array('name' => $name),
    'out' => array('inline' => 1)
));

var_dump($response['result']);
于 2012-06-29T01:01:39.593 に答える