Получить индекс после нажатия - PullRequest
1 голос
/ 08 декабря 2011

Как получить новый индекс после использования модификатора $push, чтобы вставить новое значение в массив?

Например, у меня есть массив в документе,

{ ...
    'myarray': [1, 2, 3]
 ....
}

После нажатия, скажем, числа 10 в myarray, хотите получить индекс № 3.

Я думаю использовать count метод, но думаю, что он не будет атомарным.

1 Ответ

1 голос
/ 10 декабря 2011

Это не было бы атомно.Лучший способ сделать что-то вроде этого - использовать 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) - обработка этого случая зависит от вашего приложения.

...