Database MongoDB是否可以只更新文档的一部分?

Database MongoDB是否可以只更新文档的一部分?,database,mongodb,Database,Mongodb,我有这个: //users collection: { personal_info: { first_name: "John", address: { city: "New york", street: "A" } } } 我想用以下内容进行下一次更新: req.body = { "address.street": "B" } db.users.update({}, {$set: req.body}, err => { .

我有这个:

//users collection:
{
  personal_info: {
    first_name: "John",
    address: {
      city: "New york",
      street: "A"
    }
  }
}
我想用以下内容进行下一次更新:

req.body = {
  "address.street": "B"
}

db.users.update({}, {$set: req.body}, err => {
  ...
});
如您所见,我获取了整个文档,并要求mongo只更新集合中更改的内容

这可能吗

相反,Mongo获取整个文档并替换它,然后设置一个新文档:

{
   personal_info: {
     first_name: "John",
     address: {
       street: "B"
     }
   }
} // notice that "address.city" is gone

您正在使用其他路径更新文档

您的更新会生成第一级地址,而无需处理所需的字段

基于您的
req.body

db.users.update({}, {$set: req.body}
像这样更新文档

{ 
    "_id" : ObjectId("5c2e4872e44cfe4170bc1565"), 
    "personal_info" : {
        "first_name" : "John", 
        "address" : {
            "city" : "New york", 
            "street" : "A"
        }
    }, 
    "address" : {
        "street" : "B"
    }
}
因为您的地址在
个人信息
字段中

要执行所需操作,必须正确指定根

db.sample.update({}, {$set: {"personal_info.address.street" : "B"}})

我希望很清楚,我想告诉MongoDB更新文档中对象中唯一更改的字段,而不是替换整个对象。为什么有
“address.street”
而不是
“personal\u info.address.street”
?@mickl搞错了。已编辑。可以更改正确的根目录。当用户更新资源时,并非所有字段都是必需的。。我可以自己为他的查询做一个解析器,但这很乏味,也许MongoDB内置了自己的解析器?这是我的问题。顺便说一下,你上次的回答让我对你的问题有点困惑。我认为你把问题放大了。编写自己的解析器似乎是一个夸张的解决方案。这只是一个文档的更新,如果您的根目录可以更改,您可能需要以不同的方式设计文档。我只想发送一个带有a键的对象,并告诉MongoDB只更新a键,而不是替换整个对象。。