Счетчик MongoDB с начальным значением, отличным от нуля

Я хотел бы создать счетчик, который начинается с 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?


person Carl D'Halluin    schedule 20.04.2015    source источник


Ответы (1)


Вы не можете выполнять несколько операций обновления для одного и того же поля в одной атомарной операции, для этого вам нужно выполнить два запроса на обновление: один, чтобы проверить, существует ли поле value, используя $exists, затем используйте $inc в обновлении и еще один запрос, который проверяет отсутствие поля 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
});
person chridam    schedule 20.04.2015