Php 如何在MongoDB中对数组项进行原子重新排序?

Php 如何在MongoDB中对数组项进行原子重新排序?,php,mongodb,Php,Mongodb,我有一个播放列表收藏。集合中的每个文档都包含一个条目字段,即一个数组 如何原子地更改播放列表中项的顺序? (例如,如果另一个用户同时尝试$push一个新条目,我想确保只有在重新排序后,新条目才被$push编辑) 如果我执行find(),然后在PHP中重新排序,然后执行update(),如果操作不是原子操作,我可能会丢失新的$pushed条目 这是一个示例播放列表对象: { "_id" : "playlist1", "title" : "Playlist One", "en

我有一个
播放列表
收藏。集合中的每个文档都包含一个
条目
字段,即一个数组

如何原子地更改播放列表中
项的顺序?
(例如,如果另一个用户同时尝试
$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需要一个写锁,这意味着它会阻止其他操作

(来自)

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

不过,如果您有另一个不涉及“字符串中的代码”的想法(例如,
$func=“function(){do_something();return\'something\'”}
),请分享

谢谢

使用eval()来阻止操作是当前实现的一个副作用,而不是一个可以依赖的特性

MongoDB wiki有一个页面,其中包含有关的信息

与您的用例相关的策略是:

  • 获取对象
  • 在本地修改对象
  • 发送一个更新请求,说明“如果对象仍然匹配其旧值,则将其更新为此新值”