繁体   English   中英

如何在MongoDB中自动对数组项进行重新排序?

[英]How can I atomically reorder array items in 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\\" }" )),请分享一下。

谢谢!

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

MongoDB Wiki上有一个页面,其中包含有关原子操作的信息。

与您的用例相关的策略是“如果当前更新”

  1. 获取对象。
  2. 在本地修改对象。
  3. 发送一条更新请求,内容为“如果对象仍旧与其旧值匹配,则将该对象更新为该新值”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM