让我们假设下面的文档:
{
"_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
的增量。如果你选择在顶层设置单独的字段(即不改变你的文档结构),你将被要求也取消设置现有的值,你想要删除,如果这不是一个问题,当然也是一个选项。