鉴于以下项目集合:
/* 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"}
)
答案 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"。