初始值不为零的 Mongodb 计数器

Car*_*uin 5 upsert mongodb findandmodify

我想创建一个从 1000 开始的计数器。

即upsert一个mongodb文档如下

  • 如果该文档不存在,则创建一个,值为 1000
  • 如果文档已经存在,则将值增加+1

以下不起作用:

environment_data:PRIMARY> db.test.findAndModify
   ({query:{key:"mycounter"},
     update:{$inc:{value:1}, $set:{value:1000}},
     upsert:true})

Error: findAndModifyFailed failed: {
 "errmsg" : "exception: Cannot update 'value' and 'value' at the same time",
 "code" : 16836,
 "ok" : 0
}
Run Code Online (Sandbox Code Playgroud)

有没有办法告诉 upsert 对于插入,它需要 $set 1000 ,但对于更新,它需要 $inc 1 ?

chr*_*dam 3

您不能在一个原子操作中对同一字段执行多个更新操作,您需要为此发出两个更新查询:一个使用运算符检查该value字段是否存在$exists,然后在更新中使用该$inc运算符,另一个查询检查如果该字段不存在value,则设置新值 1000。

db.test.findAndModify({
    query: { key: "mycounter", value: { $exists: true, $ne : null } },    
    update: { $inc: { value: 1 } },
    upsert: true
});
Run Code Online (Sandbox Code Playgroud)

db.test.findAndModify({
    query: { key: "mycounter", value: { $exists: false } },    
    update: { $set: { value: 1000 } },
    upsert: true
});
Run Code Online (Sandbox Code Playgroud)