Это не было бы атомно.Лучший способ сделать что-то вроде этого - использовать findAndModify:
http://www.mongodb.org/display/DOCS/findAndModify+Command
Вот пример, который бы атомарно применил обновление $ push и вернул полученный документ.Обратите внимание, что вызов findAndModify возвращает «новый» документ с примененным push.Это атомарное.
MongoDB shell version: 2.1.0
connecting to: test
> db.z.save({"a":[], "name": "list1"})
> db.runCommand({ "findAndModify": "z", "query": { "name": "list1" }, "update": { "$push": { "a": 64 } }, "new": true })
{
"lastErrorObject" : {
"updatedExisting" : true,
"n" : 1,
"connectionId" : 65,
"err" : null,
"ok" : 1
},
"value" : {
"_id" : ObjectId("4ee27202c469f4b2d3c6cbf9"),
"a" : [
64
],
"name" : "list1"
},
"ok" : 1
}
> db.z.find()
{ "_id" : ObjectId("4ee27202c469f4b2d3c6cbf9"), "a" : [ 64 ], "name" : "list1" }
Затем вы вычислите индекс в клиентском коде.Обратите внимание, что последующие операции МОГУТ сделать этот индекс недействительным (т. Е. Последующее удаление, $ set или $ pull) - обработка этого случая зависит от вашего приложения.