MongoDB更新嵌套数组中的字段

时间:2012-03-08 01:44:29

标签: php mongodb database

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

3 个答案:

答案 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;