Как я могу атомарно переупорядочить элементы массива в MongoDB? - PullRequest
2 голосов
/ 17 октября 2011

У меня есть коллекция playlists. Каждый документ в коллекции содержит поле entries, которое является массивом.

Как можно атомарно изменить порядок entries в списке воспроизведения? (например, если другой пользователь одновременно попытается до $push новой записи, я хочу убедиться, что новая запись $push редактируется только после изменения порядка)

Если я сделаю find(), затем изменим порядок в PHP, тогда update(), я могу потерять новую запись $push ed, если операция не является атомарной.

Это пример объекта списка воспроизведения:

{
    "_id" : "playlist1",
    "title" : "Playlist One",
    "entries" : [
            {
                    "class" : "song",
                    "identifier" : "song1"
            },
            {
                    "class" : "song",
                    "identifier" : "song2"
            },
            {
                    "class" : "song",
                    "identifier" : "song3"
            }
    ]
}

Edit:

Мне кажется, я нашел возможное решение, используя execute():

Запуск JavaScript в базе данных требует блокировки записи, то есть блокирует другие операции.

(из http://php.net/manual/en/mongodb.execute.php)

Мне просто нужно выполнить код (find() + reorder() + update()) на сервере MongoDB.

Тем не менее, если у вас есть другая идея, которая не включает "код в строке" (например, $func = "function() { do_something(); return \"something else\" }"), пожалуйста, поделитесь ей.

Спасибо!

1 Ответ

1 голос
/ 05 августа 2012

Использование eval () для блокировки операций является побочным эффектом текущей реализации, а не функцией, на которую можно положиться.

Вики MongoDB содержит страницу с информацией о Атомных операциях .

Соответствующей стратегией для вашего варианта использования будет «обновить, если текущий» :

  1. Получить объект.
  2. Изменить объект локально.
  3. Отправьте запрос на обновление, в котором говорится "обновите объект до этого нового значения, если оно все еще соответствует его старому значению".
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...