Вы можете использовать findAndModify для атомарной обработки транзакции (по крайней мере, в этом случае).
Эта команда принимает флаг upsert
, который можно использовать для обновления или вставки документа на основеего existence
.Проверьте приведенный ниже пример
> db.upsertTest.find()
{ "_id" : 1, "arr" : [ 1 ] }
, и при вводе этой команды с запросом _id:1
новый элемент будет добавлен (добавлен) в arr
> db.upsertTest.findAndModify({query: {_id:1},update:{$push:{arr:2}},upsert:true,"new":true})
{ "_id" : 1, "arr" : [ 1, 2 ] }
, и это создаст новый элемент, поскольку_id:2
уже не существует
> db.upsertTest.findAndModify({query: {_id:2},update:{$push:{arr:2}},upsert:true,"new":true})
{ "_id" : 2, "arr" : [ 2 ] }
> db.upsertTest.find()
{ "_id" : 1, "arr" : [ 1, 2 ] }
{ "_id" : 2, "arr" : [ 2 ] }
Надеюсь, это поможет.