如何从特定MongoDB文档中的对象数组中获取特定对象?

时间:2012-06-28 17:59:15

标签: php mongodb

我的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。请帮忙。

3 个答案:

答案 0 :(得分: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" } ] } }

答案 1 :(得分:0)

您无法使用MongoDB执行此操作:例如,MongoDB不会深入查看特定文档以从数组中提取项目,您必须自己执行此操作。

现在PHP驱动程序可能会做更多的工作,我不知道 - 我正在谈论MongoDB核心查询。

答案 2 :(得分: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']);