У меня есть коллекция 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\" }"
), пожалуйста, поделитесь ей.
Спасибо!