我怎样才能在MongoDB中对数组项进行原子重新排序?

时间:2011-10-17 08:24:51

标签: php mongodb

我有一个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"
            }
    ]
}

修改

我想我找到了一个可能的解决方案,使用execute()

  

在数据库中运行JavaScript会占用写锁定,这意味着它会阻止其他操作。

(来自http://php.net/manual/en/mongodb.execute.php

我只需要在MongoDB服务器上执行代码(find() + reorder() + update())。

但是,如果您有其他想法不涉及“字符串中的代码”(例如$func = "function() { do_something(); return \"something else\" }"),请分享。

谢谢!

1 个答案:

答案 0 :(得分:1)

使用eval()来阻止操作是当前实现的副作用,而不是依赖的功能。

MongoDB wiki有一个页面,其中包含Atomic Operations的信息。

您的用例的相关策略是"update if current"

  1. 获取对象。
  2. 在本地修改对象。
  3. 发送更新请求,说明"如果对象仍然与其旧值匹配,则将对象更新为此新值"。