2011-10-17 27 views
2

我有一个playlists集合。集合中的每个文档都包含一个entries字段,即一个数组。如何自动重新排列MongoDB中的数组项目?

如何以原子方式更改播放列表中的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" 
      } 
    ] 
} 

编辑:

我想我找到了一个可能的解决方案,使用​​:

在运行的JavaScript数据库需要写入锁定,这意味着它会阻止其他操作。

(从http://php.net/manual/en/mongodb.execute.php

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

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

谢谢!

回答

1

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

MongoDB wiki有一个关于Atomic Operations的信息页面。

为您的使用情况下的相关策略是"update if current"

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