我有一个收藏。集合中的每个文档都包含一个playlists
字段,即一个数组。
如何原子地更改播放列表中entries
的顺序?
(例如,如果另一个用户同时尝试entries
一个新条目,我想确保只有在重新排序之后新条目才被$push
编辑)
如果我执行$push
,然后在php中重新排序,然后find()
,如果操作不是原子的,我可能会丢失新的update()
ed条目。
这是一个示例播放列表对象:
{
"_id" : "playlist1",
"title" : "Playlist One",
"entries" : [
{
"class" : "song",
"identifier" : "song1"
},
{
"class" : "song",
"identifier" : "song2"
},
{
"class" : "song",
"identifier" : "song3"
}
]
}
编辑:
我想我找到了一个可能的解决方案,使用
$push
:在数据库中运行javascript需要一个写锁,这意味着它会阻塞其他操作。
(来自http://php.net/manual/en/mongodb.execute.php)
我只需要在MongoDB服务器上执行代码(
execute()
+find()
+reorder()
)。不过,如果你有另一个不涉及“字符串中的代码”的想法(例如
update()
),请与我们分享。谢谢!
最佳答案
使用eval()来阻止操作是当前实现的副作用,而不是要依赖的功能。
MongoDB Wiki有一个包含Atomic Operations信息的页面。
与您的用例相关的策略是:
取出物体。
在本地修改对象。
发送一个更新请求,上面写着“如果对象仍与旧值匹配,则将其更新为此新值”。