我的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。请帮忙。
答案 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']);