在mongodb中交换数组中的值

时间:2014-10-24 13:06:11

标签: arrays mongodb

我看了:Swap the values in a MongoDB array

并试图使用它,但它不适用于我所拥有的例子,因此我会问我是否遗漏了任何东西,或者我是否需要采用不同的方法。

我有一个包含如下对象的数据库:

    {
       "_id": ObjectId("5448ec9c97086e180c239346"),
       "cfg": {
         "children": {
           "0": ObjectId("5448ecb2d9f98f3c1746f5ba"),
           "1": ObjectId("5448ecb2d9f98f3c1746f5bf"),
           "2": ObjectId("5448ecb2d9f98f3c1746f5bb"),
           "3": ObjectId("5448ecb2d9f98f3c1746f5c0"),
           "4": ObjectId("5448ecb2d9f98f3c1746f5bc"),
           "5": ObjectId("5448ecb2d9f98f3c1746f5c1"),
           "6": ObjectId("5448ecb2d9f98f3c1746f5bd"),
           "7": ObjectId("5448ecb2d9f98f3c1746f5c2"),
           "8": ObjectId("5448ecb2d9f98f3c1746f5be"),
           "9": ObjectId("5448ecb2d9f98f3c1746f5c3")
        }
      }
    }   

它还有对象在“子”列表中监听。

这应该是一个有序列表,所以如果我想将索引6移动到索引4,我还必须将5向下移动到6,将4向下移动到5。

我处理这个问题的方法是尝试使用我在开头的链接中建议的交换,然后运行递归。

我不想在这里粘贴很多代码,但基本上我做的是:

function swapChilds(index, i, parent, steps, self,callback){
    if (i >= steps + 1)
        return callback(null);
    // Genereate swap
    self.collection.update({_id: parent.meta.parentObjectID},{$set: swap}, function(err){
        if (err){
            console.log('errSwap:' + err);
            return callback(err);
        }
        swapChilds(index,i + 1, parent, steps, self,callback);
    });
}

所以这使用了索引和i来获得正确的交换,然后只调用自己,直到它被调用了几步(我从i = 1开始)

当我绑这个时,我也在使用console.log(swap)只是为了看它看起来不错,而且它看起来像是:

{ 'cfg.children.6': 5448ecb2d9f98f3c1746f5c1,
  'cfg.children.5': 5448ecb2d9f98f3c1746f5bd }
{ 'cfg.children.5': 5448ecb2d9f98f3c1746f5bc,
  'cfg.children.4': 5448ecb2d9f98f3c1746f5c1 }

有两个问题,第一个是最后一行应该是'cfg.children.4':5448ecb2d9f98f3c1746f5bd(注意最后两个字母),因为这个“bd”应该被移动到位置4我知道为什么会发生这种情况,因为我没有获得父版本的新版本,所以它将使用旧列表(将修复并测试它是否有任何区别)。

现在尽管出现了这个错误,代码什么也没做,当我在运行这个集合后检查数据库时,没有任何改变。

我不明白问题出在哪里。我在这里做错了吗? 它与ObjectID有什么关系吗?我试图只使用字符串,我试图制作新的ObjectID(correctValue),但它根本没有做任何事情。

如何进行多次交换以保持订单的排序?

1 个答案:

答案 0 :(得分:0)

我在论证中搞砸了就这么简单。

如果有人在修复程序中遇到新代码,那么:

function swapChilds(index, i, parent, steps, self,callback){
    if (i >= steps + 1)
        return callback(null);
    // Genereate swapdata
    self.collection.update({_id: parent._id},{$set: swap}, function(err){
        if (err){
            console.log('errSwap:' + err);
            return callback(err);
        }
        self.getObjectById(parent._id, function(err,parent2) {
            if (err){
                console.log('errSwap2:' + err);
                return callback(err);
            }
            swapChilds(index,i + 1, parent2, steps, self,callback);
        });
    });
}

我已经添加了一个调用来获取更新的父级,以便它在第一次交换后不会使用旧值,我也会更改为parent._id而不是在parent.meta之前使用的错误的父级。 .parentObjectId(我只想要当前的对象而不是它的父级)。