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"
        },
        …
        ]
    }
}

我需要从array_of_objects中获取一个具有指定名称的文档的特定 id 的对象。我使用 php 并尝试执行下一个代码:

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

它返回array_of_objects的所有元素,而不是id为507 的元素。之后我尝试使用 $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 回答