2011-12-30 117 views
3

我有一個嵌套有序項目數組的文檔,我需要自動重新排列數組中的項目。原子序列MongoDB文檔嵌套數組中的項目

  1. 服務器端代碼是否適合此任務?
  2. 服務器端代碼是這個任務的唯一解決方案嗎?
  3. 在巫範圍這個代碼將阻塞:
    • 單個文檔
    • 單個集合
    • 整個服務器?

這是將在服務器側執行的代碼:

var reorder = function (
    catalog_id, 
    parent_id, 
    item_id, 
    new_pos) { 

    var old_pos; 

    var collection = db.catalogs; 
    var catalog = collection.findOne({catalog_id:catalog_id}); 
    var result = []; 

    for(i in catalog.list) { 

     var item = catalog.list[i]; 

     if(item.id == item_id) { 

      old_pos = item.order; 
      result.push({old_pos:old_pos}); 
      break; 
     } 
    } 

    if(old_pos == new_pos) 
     return result; 

    var up = new_pos < old_pos; 

    catalog.list.forEach(function(item){ 

     if(item.parent == parent_id && 
      (up ? 
       (item.order <= old_pos && item.order >= new_pos) : 
       (item.order <= old_pos && item.order >= new_pos))){ 

      if(item.id != item_id) { 

       item.order++; 
       result.push({down:item}); 
      } 
      else { 

       item.order = new_pos; 
       result.push({up:item}); 
      } 

      collection.update(
       {catalog_id:catalog_id, 'list.id':item.id}, 
       {$set:{'list.$.order':item.order}}); 
     } 
    }); 

    return result; 
}; 

reorder('diagnostic_graph', 'n1', 'n5', 1); 

這是一個樣本數據:

{ 
    "_id" : ObjectId("4efc939094f4a115d80c8543"), 
    "catalog_id" : "diagnostic_graph", 
    "list" : [{ 
     "id" : "n1", 
     "order" : 0 
    }, { 
     "id" : "n2", 
     "parent" : "n1", 
     "order" : 0 
    }, { 
     "id" : "n3", 
     "parent" : "n1", 
     "order" : 1 
    }, { 
     "id" : "n4", 
     "parent" : "n1", 
     "order" : 2 
    }, { 
     "id" : "n5", 
     "parent" : "n1", 
     "order" : 3 
    }] 
} 

PS。對不起,如果有什麼不清楚 - 英語不是我最好的技能

+0

我不確定這個操作是否會自動運行。據我所知,它會產生鎖定。 – 2011-12-30 13:32:38

+2

但是,您可以在客戶端計算所有這些信息,然後原子重寫文檔。 – 2011-12-30 13:37:48

+1

我想MongoDB傢伙們建議使用[Update if Current Update](http://www.mongodb.org/display/DOCS/Atomic+Operations#AtomicOperations-%22UpdateifCurrent%22)方法(類似於CAS(「change-and-set 「)在memcached中)的原子文檔更改無法用」更新修飾符「表示。 – 2011-12-30 13:55:08

回答

0

問1.服務器端代碼是否是這個任務的正確解決方案?

A 1.這取決於。如果數組需要在使用時重新排序,那麼每當將數組添加到數組時,都應重新排序。無論何時將項目推送到數組,或者在應用程序中執行,都可以調用服務器端.js代碼。

問2.服務器端代碼是否是此任務的唯一解決方案?

答2.正如我在第一個問題的答案中所說的那樣,它不是唯一的解決方案。

問題3在女巫範圍這個代碼將阻塞:

A 3.答案是單個文檔(AFAIK)。