我看了: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),但它根本没有做任何事情。
如何进行多次交换以保持订单的排序?
答案 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(我只想要当前的对象而不是它的父级)。