给出子文档标准更新Mongo子文档

时间:2014-07-25 15:36:35

标签: mongodb

鉴于以下项目集合:

/* 0 */
{
    "_id" : "0",
    "itemName" : "item1",
    "person" : 
    {
        "name" : "a"
    }
}
/* 1 */
{
    "_id" : "1",
    "itemName" : "item2",
    "person" : 
    {
        "name" : "a"
    }
}
/* 2 */
{
    "_id" : "2",
    "itemName" : "item3",
    "person" : 
    {
        "name" : "b"
    }
}

如何更新名为" a"到" a2"?

这不起作用:

db.items.update(
    { "person.name" : "a" },
    { $set :{ "person.name" :"a2"} }
)

更新 实际上,上面的确实有效,但它只适用于第一条记录。将多参数传递给它会更新所有参数。

这给了我错误"未被捕获的例外:无法做到。在字段名称[person.name]"

db.items.update(
    { "person.name" : "a" },
    { "person.name" : "a2"}
)

1 个答案:

答案 0 :(得分:0)

根据您提供的更新信息,如果您的项目集合中的文档如下所示:

{
    "_id" : "0",
    "itemName" : "item1",
    "person" : 
    {
        "name" : "a"
    }
}

然后你可以更新名为" a"的所有人的姓名。命名" b"通过运行:

db.items.update({ "person.name" : "a" }, { "$set" : { "person.name" : "b" } }, { "multi" : true });

这将匹配所有人的价值" a"在name字段中,将字段的值设置为" b"并将multi选项设置为true,将其应用于所有文档。否则,只会更新第一场比赛。

命令db.items.update({ "person.name" : "a" }, { "person.name" : "a2"} );给出错误,因为使用该语法,update()所做的是将整个匹配文档替换为指定为第二个参数的文档。因此,它拒绝此更新,认为您要将文档替换为包含字段person.name的文档,其值为" a2"。