Mongodb 根据子文档条件更新Mongo子文档

Mongodb 根据子文档条件更新Mongo子文档,mongodb,Mongodb,鉴于以下项目集合: /* 0 */ { "_id" : "0", "itemName" : "item1", "person" : { "name" : "a" } } /* 1 */ { "_id" : "1", "itemName" : "item2", "person" : { "name" : "a" } } /* 2 */ { "_id" : "2", "

鉴于以下项目集合:

/* 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"} }
)
更新 事实上,上述方法确实有效,但它只适用于第一条记录。将多参数传递给该参数将更新所有参数

这给了我一个错误“uncaughtexception:cannothave.in字段名[person.name]”


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

{
    "_id" : "0",
    "itemName" : "item1",
    "person" : 
    {
        "name" : "a"
    }
}
然后,您可以通过运行以下命令将所有名为“a”的人员的姓名更新为“b”:

db.items.update({ "person.name" : "a" }, { "$set" : { "person.name" : "b" } }, { "multi" : true });
这将使用
name
字段中的值“a”匹配所有人,将该字段的值设置为“b”,并通过将
multi
选项设置为
true
将其应用于所有文档。否则,将只更新第一个匹配项


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

您的集合的结构似乎错误。或者至少是你质疑它的方式。运行
db.person.findOne()
时会看到什么?对不起,手动键入数据时会出现打字错误,已更新question@dev它仍然不正确,您正在显示一个包含多个名为“\u id”和“person”字段的文档。您显示的架构仍然存在问题。
\u id
有重复的字段和值,这些字段和值必须是唯一的。能否添加运行命令时看到的内容
db.person.findOne()来自
mongo
shell?这样可以更好地了解您的文档在person集合中的外观。或者看看下面我的答案。@dev根据您最近的更新,“This not work”后面的代码是正确的,但是您希望将
{multi:true}
选项添加到调用中,以便它应用于所有匹配的文档,而不仅仅是第一个文档。
db.items.update({ "person.name" : "a" }, { "$set" : { "person.name" : "b" } }, { "multi" : true });