2011-10-17 61 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. 發送一條更新請求,指出「如果該對象仍然與舊值相匹配,則將該對象更新爲此新值」。