原子重新排序MongoDB文档的嵌套数组中的项目

时间:2011-12-30 13:26:46

标签: mongodb

我有一个包含有序项目嵌套数组的文档,我需要对该数组中的项目进行原子重新排序。

  1. 服务器端代码是否适合执行此任务?
  2. 服务器端代码是此任务的唯一解决方案吗?
  3. 在女巫范围内,此代码将阻止:
    • 单个文件
    • 单一集合
    • 整个服务器?
  4. 这是将在服务器端执行的代码:

    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。抱歉,如果事情不清楚 - 英语不是我最好的技能

1 个答案:

答案 0 :(得分:0)

问1.服务器端代码是否适合执行此任务?

A 1.这取决于。如果数组需要在每次使用时重新排序,那么每当您向数组添加项目时都应重新排序。无论何时将项目推送到数组,都可以调用服务器端.js代码,或者在应用程序中执行此操作。

问2.服务器端代码是否是此任务的唯一解决方案?

A 2.正如我在第一个问题的答案中所述,这不是唯一的解决方案。

问3.在女巫范围内,此代码将阻止:

A 3.答案是单一文件(AFAIK)。