我有一个收藏。集合中的每个文档都包含一个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信息的页面。
与您的用例相关的策略是:
取出物体。
在本地修改对象。
发送一个更新请求,上面写着“如果对象仍与旧值匹配,则将其更新为此新值”。

10-06 05:05
查看更多