Php 如何从特定MongoDB文档中的对象数组中获取特定对象?
我的MongoDB文档有一个结构:Php 如何从特定MongoDB文档中的对象数组中获取特定对象?,php,mongodb,Php,Mongodb,我的MongoDB文档有一个结构: { _身份证号码:“12345”, 姓名:"富",, 对象:{ _对象的数组_:[{ 身份证号码:507, 名字:“某个名字”, dt:“2012-06-27 16:35:50” },{ 身份证号码:506 名字:“其他名字”, dt:“2012-06-2116:09:05” }, … ] } } 我需要从对象的数组中获取一个对象,该对象具有文档的特定id,并具有指定的名称。我使用php并尝试执行下一个代码: $collection->find(数组('na
{
_身份证号码:“12345”,
姓名:"富",,
对象:{
_对象的数组_:[{
身份证号码:507,
名字:“某个名字”,
dt:“2012-06-27 16:35:50”
},{
身份证号码:506
名字:“其他名字”,
dt:“2012-06-2116:09:05”
},
…
]
}
}
我需要从对象的数组中获取一个对象,该对象具有文档的特定id,并具有指定的名称。我使用php并尝试执行下一个代码:
$collection->find(数组('name'=>'foo','object.array_of_objects.id'=>507));
它返回\u对象的数组\u的所有元素,而不是id为507的元素。
之后,我尝试使用$elemMatch进行查询:
$collection->find(数组('name'=>'foo','object.array\u of_objects'=>array('elemMatch'=>array('id'=>507)));
但它的回报是一样的(
我的MongoDB版本2.0.6。请提供帮助。您不能使用MongoDB执行此操作:MongoDB不会深入到特定文档以从数组中提取项目。例如,您必须自己执行此操作
现在PHP驱动程序可能会做更多的工作,我不知道——我说的是MongoDB核心查询。这个问题已经解决,将在下一个稳定版本MongoDB 2.2中提供: 我刚刚使用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" } ] } }
所以,我用MapReduce做了。希望这能节省一些时间和精力
$name='foo';
$id=507;
$mongo=新mongo(“…”);
$db=$mongo->my_db;
$map=newmongocode('function(){'。
'this.object.array_of_objects.forEach(function(obj){'。
'如果(对象id='.$id.')'。
“发射(1,obj);”。
'});}'
);
$reduce=newmongocode('function(k,v){return[k,v];}');
$response=$db->command(数组(
“mapreduce”=>“我的收藏”,
'map'=>$map,
“reduce”=>reduce美元,
'query'=>array('name'=>$name),
'out'=>array('inline'=>1)
));
var_dump($response['result']);
MongoDB的缺点:@david cheung谢谢!因此,我将尝试使用Mapreduce来实现这一点。您可以返回字段的子集-查看MongoDB文档:@Jenna是的,您是对的——但是基于其值的数组中的特定项?据我所知,可以通过获取整个对象数组和搜索desir来实现使用PHP或MapReduce编辑项目,对吗?各位好消息!谢谢,@Jenna!