MongoDB:如何更新集合中的整个文档

j3d*_*j3d 3 mongodb

在我的应用程序中,我需要编辑一个文档...,并且在编辑文档时,其他用户仍然可以使用当前的[未更改]版本。例如,当我开始编辑文档时,会在一个单独的集合中创建它的新副本,完成后,我用临时集合的新版本替换当前版本。

假设存储在collection中的原始文档users如下所示:

{
  "_id" : ObjectId("53b986e2fe000000019a5a13"),
  "name" : "Joe",
  "birthDate" : "2080-12-11",
  "publications" : [
    { "title" : "title 1", "description" : "description 1" },
    { "title" : "title 2", "description" : "description 2" }
  ]
}
Run Code Online (Sandbox Code Playgroud)

然后,假设上面的文档被复制到另一个集合(例如users.wip)并按如下所示进行修改:

{
  "_id" : ObjectId("53b986e2fe000000019a5a13"),
  "name" : "Joe",
  "birthDate" : "1980-12-11",
  "publications" : [
    { "title" : "bye bye", "description" : "Blah blah" },
    { "title" : "title 2", "description" : "description 2" },
    { "title" : "title 3", "description" : "description 3" }
  ]
}
Run Code Online (Sandbox Code Playgroud)

如何替换Whoe文件?问题是,当我尝试更新原始文档时,

{ "$set" : {
  "name" : "Joe",
  "birthDate" : "1980-12-11",
  "publications" : [
    { "title" : "bye bye", "description" : "Blah blah" },
    { "title" : "title 2", "description" : "description 2" },
    { "title" : "title 3", "description" : "description 3" }
  ]
}}
Run Code Online (Sandbox Code Playgroud)

我总是收到以下错误消息:

10150  Field name duplication not allowed with modifiers
Run Code Online (Sandbox Code Playgroud)

也就是说,更新整个文档的正确方法是什么?

Joh*_*yHK 6

要替换整个文档,您无需使用$set,而只需提供新文档即可update

db.test.update({"_id": ObjectId("53b986e2fe000000019a5a13")}, {
  "_id" : ObjectId("53b986e2fe000000019a5a13"),
  "name" : "Joe",
  "birthDate" : "1980-12-11",
  "publications" : [
    { "title" : "bye bye", "description" : "Blah blah" },
    { "title" : "title 2", "description" : "description 2" },
    { "title" : "title 3", "description" : "description 3" }
  ]
})
Run Code Online (Sandbox Code Playgroud)

但是,对于当前的3.0驱动程序,最好改为使用replaceOne

db.test.replaceOne({"_id": ObjectId("53b986e2fe000000019a5a13")}, {
  "name" : "Joe",
  "birthDate" : "1980-12-11",
  "publications" : [
    { "title" : "bye bye", "description" : "Blah blah" },
    { "title" : "title 2", "description" : "description 2" },
    { "title" : "title 3", "description" : "description 3" }
  ]
})
Run Code Online (Sandbox Code Playgroud)

  • 除非您在替换文档中提供新的“_id”值,否则“_id”值将保持不变。 (2认同)