你可以僅僅刪除的$setOnInsert
,因爲這將更新操作將被設置爲在$inc
運營商指定的值,如果這個文件不存在
https://docs.mongodb.com/v3.2/reference/operator/update/inc/#behavior
如果該字段不存在, $ inc創建該字段並將該字段設置爲指定的值。從蒙戈外殼
例子:
> db.dropDatabase()
{ "ok" : 1 }
> db.test.findOneAndUpdate({_id: "meta"}, { $inc: { version: 1} }, {upsert: true, returnNewDocument: true})
{ "_id" : "meta", "version" : 1 }
> db.test.findOneAndUpdate({_id: "meta"}, { $inc: { version: 1} }, {upsert: true, returnNewDocument: true})
{ "_id" : "meta", "version" : 2 }
> db.test.findOneAndUpdate({_id: "meta"}, { $inc: { version: 1} }, {upsert: true, returnNewDocument: true})
{ "_id" : "meta", "version" : 3 }
> db.test.findOneAndUpdate({_id: "meta"}, { $inc: { version: 1} }, {upsert: true, returnNewDocument: true})
{ "_id" : "meta", "version" : 4 }
> db.test.findOneAndUpdate({_id: "meta"}, { $inc: { version: 1} }, {upsert: true, returnNewDocument: true})
{ "_id" : "meta", "version" : 5 }
如果您需要設置一個給定的版本,第一個初始插件,然後MongoDB中不支持任何運營商原子支持這一點,但後續會安全是一個常見的解決方法:
> db.dropDatabase()
{ "dropped" : "test", "ok" : 1 }
> function updateMeta(){
... function update(){
... return db.test.findOneAndUpdate({_id: "meta"}, { $inc: { version: 1} }, {returnNewDocument: true});
... }
...
... var result = update();
...
... if(result === null){
... db.test.insert({_id: "meta", version: -10});
... result = update();
... }
...
... return result;
... }
>
> updateMeta()
{ "_id" : "meta", "version" : -9 }
> updateMeta()
{ "_id" : "meta", "version" : -8 }
> updateMeta()
{ "_id" : "meta", "version" : -7 }
> updateMeta()
{ "_id" : "meta", "version" : -6 }
> updateMeta()
{ "_id" : "meta", "version" : -5 }
>
我想添加這個例子中,當你有值的嵌套的對象:{_id:1,小時:{0:0,1:0,2:0 }}並且如果文檔不存在或只是想要添加並增加一小時如果有的話,增加一小時。其實這是不可能的,也不違反任何邏輯。 – jtomasrl