MongoDB更新嵌套数组中的字段
如何在照片数组中将“播放”设置为“播放照片”?
我只知道它的_id。
"_id": ObjectId("4f41a5c7c32810e404000000"),
"albums": [
{
"_id": ObjectId("4f545d1bc328103812000000"),
"name": "album1" ,
"photos":[{
"_id": ObjectId("4f545d1bc328103812d00000"),
"name":"travel photo"
},{
"_id": ObjectId("4f545d1bc328103812c00000"),
"name":"play"
}]
},
{
"_id": ObjectId("4f545f56c328103c12000000"),
"name": "album2"
},
{
"_id": ObjectId("4f545f68c328103012000000"),
"name": "album3"
},
{
"_id": ObjectId("4f546642c328103c12000001"),
"name": "album4"
}]
答案 0 :(得分:7)
你做不到。位置运算符仅适用于文档层次结构中的第一个数组。因此,您无法操纵更深层的nester数组的各个元素。
这是一个已知问题,计划在此处进行开发:https://jira.mongodb.org/browse/SERVER-831
在那段时间之前,你必须对你的架构进行规范化,我担心。
答案 1 :(得分:6)
此问题已解决。字段更新功能 在嵌套的对象数组中,在MongoDB 3.6+版本中可用。 看看位置运算符(全部并带有标识符)here。
//Update all docs in collection matching photo name "play" to "play photo"
db.collectioname.update(
{},
{ $set: { "albums.$[].photos.$[photo_field].name": "play photo" } },
{ arrayFilters: [ {"photo_field.name": "play"} ], multi: true}
);
//Update this specific doc given in question matching photo name "play" to "play photo"
db.collectioname.update(
{"_id" : ObjectId("4f41a5c7c32810e404000000")},
{ $set: { "albums.$[].photos.$[photo_field].name": "play photo" } },
{ arrayFilters: [ {"photo_field.name": "play"} ]}
);
这是为MongoDB 3.6之后的人们提供帮助的
答案 2 :(得分:0)
Tonilin You Cant直接为此更新此类型的数组,您需要找到要更新的数组的索引,如果您要将name
更新为play photo
,那么您必须找到名称为photos
的{{1}}索引。
为此,我使用了这样的代码:
play
//现在要在数据库中更新此值,请使用此代码...
$m = new Mongo();
$db=$m->yourdatabase;
//testarray is my collection name
$result=$db->testarray->find();
$index='';
foreach($result as $res)
{
if(array_key_exists("albums",$res))
{
foreach($res['albums'] as $ralbum)
{
if(array_key_exists("photos",$ralbum))
{
foreach($ralbum['photos'] as $k=>$rphotos)
{
if(array_key_exists("name",$rphotos))
if($rphotos['name']=='play')
$index=$k;
}
}
}
}
}
//echo $index;