2011-12-30 4 views
3

私は順序付けされた項目のネストされた配列を持つ文書を持っており、その配列の項目を原子的に並べ替える必要があります。MongoDB文書のネストされた配列の項目をアトミックに並べ替えます

  1. このタスクの正しい解決策はサーバー側のコードですか?
  2. このタスクのサーバー側コードは唯一の解決策ですか?
  3. 魔女の範囲で、このコードは、ブロッキングします:シングルコレクション
  4. サーバ全体
    • 単一のドキュメント
    • を?

これはサーバ側で実行されるコードである。

{ 
    "_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:

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); 

これはサンプルデータです。申し訳ございませんが、何かが不明な場合 - 英語は私の最高のスキルではありません

+0

この操作をアトミックに実行するかどうかはわかりません。私の知る限り、それはロックをもたらすことができます。 –

+2

しかし、これをすべてクライアント上で計算してから、文書を原子的に書き直すことはできます。 –

+1

MongoDBの方は、[最新の場合は更新](http://www.mongodb.org/display/DOCS/Atomic+Operations#AtomicOperations-%22UpdateifCurrent%22)アプローチ(CASに似ています( "change-and-set ")をmemcachedに入れて)、" update modifiers "という言葉で表現することができないような原子文書の変更を行う。 –

答えて

0

質問1.サーバー側のコードはこのタスクの正しい解決策ですか?

1 1.それは依存します。配列を使用するたびに並べ替えが必要な場合は、配列に項目を追加するたびに並べ替える必要があります。配列にアイテムをプッシュするか、アプリケーションで実行するときはいつでも、サーバー側の.jsコードを呼び出すことができます。

Q 2.サーバー側のコードはこのタスクの唯一の解決策ですか?

2.最初の質問の答えに述べたように、それは唯一の解決策ではありません。このコードは、ブロッキングます魔女の範囲で

Q 3:

3.答えは単一の文書(私の知る限り)です。

関連する問題