Mongodb计数器的初始值不为零

时间:2015-04-20 11:07:05

标签: mongodb upsert findandmodify

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

即。如下挂载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
}

有没有办法告诉upsert,对于一个插入,它需要$设置1000,但是对于更新,它需要$ inc 1?

1 个答案:

答案 0 :(得分:2)

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

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

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