在Mongodb中更新嵌入式文档属性

时间:2011-07-20 07:19:28

标签: mongodb

我有一个看起来像这样的文件:

{
    "_id": 3,
    "Slug": "slug",
    "Title": "title",
    "Authors": [
        {
            "Slug": "slug",
            "Name": "name"
        }
    ]
}

我想基于Authors.Slug更新所有Authors.Name。 我试过这个,但它不起作用:

.update({"Authors.Slug":"slug"}, {$set: {"Authors.Name":"zzz"}});

我在这里做错了什么?

3 个答案:

答案 0 :(得分:57)

.update(Authors:{$elemMatch:{Slug:"slug"}}, {$set: {'Authors.$.Name':"zzz"}});

答案 1 :(得分:2)

您可以将update与数组过滤器一起使用:
https://docs.mongodb.com/manual/reference/operator/update/positional-filtered/#positional-update-arrayfilters

大概是这样的:

yourcollection.update(
{},
{
    "$set": {
        "Authors.$[element].Name": "zzz"
    }
},
{
    "multi": true,
    "arrayFilters": [
         { "element.Slug": "slug" }
    ]
}
)

Ps .: 它无法在Robo3T中运行,如此处所述:Mongodb 3.6.0-rc3 array filters not working? 但是,您可以尝试使用版本大于等于3.6的mongo shell。

答案 2 :(得分:-1)

是的,Rock的解决方案正在运行,P.S Notes在尝试Robo31时确实很有帮助。 如果我们要更新所有 db.collection_name.update({},{$ set:{“ Authors。$ []。Name”:“ zzz”}})

如果我们要使用数组中的匹配对象进行更新 db.collection_name.update({},{$ set:{“ Authors。$ [i] .Name”:“ zzz”}},{arrayFilters:[{“ i.Slug”:“ slug”}]}))< / p>

参考:https://jira.mongodb.org/browse/SERVER-1243