MongoDB:如何在替换整个文档时增加值



让我们假设下面的文档:

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

我需要像这样替换整个文档…

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" }
  ]
})

…但是我还需要给文档version加1。既然那样的话,$inc是不允许的,还有别的选择吗?

您可以将更新version$inc与更新其余字段的$set组合在一起:

db.test.update({"_id": ObjectId("53b986e2fe000000019a5a13")}, {
    $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" }
        ]
    },
    $inc: {version: 1}
})

我不知道有什么方法可以将批发替换在同一子文档中作为增量,但是如果您可以将数据放在子文档中,那么您可以使用$set,它将工作;

> db.test.insert({ doc: { a: 1 }, version: 1 })
> db.test.update({ }, { $set: { doc: { b: 1 } }, $inc: { version: 1 } })
> db.test.find().pretty()
{
    "_id" : ObjectId("53c1600fd904c83d877daf21"),
    "doc" : {
        "b" : 1
    },
    "version" : 2
}

注意doc的整体替换和version的增量。如果你选择在顶层设置单独的字段(即不改变你的文档结构),你将被要求也取消设置现有的值,你想要删除,如果这不是一个问题,当然也是一个选项。

最新更新