MongoDB更新嵌套数组中的字段

ton*_*lin 4 php database mongodb

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" 
}]
Run Code Online (Sandbox Code Playgroud)

Rem*_*iet 7

你不能.位置运算符仅适用于文档层次结构中的第一个数组.因此,您无法操纵更深层的nester数组的各个元素.

这是一个已知问题,计划在此开发:https://jira.mongodb.org/browse/SERVER-831

在那段时间之前,你必须将你的架构标准化一点我害怕.

  • 这是一个选项,但有严重的并发问题(一次写入可以覆盖并发写入的结果)所以要小心使用. (3认同)

Abd*_*oiz 7

此问题已得到解决.在嵌套的对象数组中更新字段的功能在MongoDB 3.6+版本中可用.在这里查看位置运算符(全部和带标识符).

//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"} ]}
);
Run Code Online (Sandbox Code Playgroud)

这是为了MongoDB 3.6之后来到这里的人们的帮助