2016-08-12 82 views
1

当使用mongoDb的$ in子句时,它旨在(并成功)维护数组的顺序(var list)。

但是,我不完全清楚它的逻辑。

我明白它是向后迭代,以保持顺序,但为什么你要指定ref列表在i -1,而不是我?

更多基本的java脚本知识,但它测试我目前的Noobness。

如果有人能帮助我按步骤分解发生的事情,我会很感激。

var list = [ 4, 2, 8 ]; 

var stack = []; 

for (var i = list.length - 1; i > 0; i--) { 

    var rec = { 
     "$cond": [ 
      { "$eq": [ "$_id", list[i-1] ] }, 
      i 
     ] 
    }; 

    if (stack.length == 0) { 
     rec["$cond"].push(i+1); 
    } else { 
     var lval = stack.pop(); 
     rec["$cond"].push(lval); 
    } 

    stack.push(rec); 

} 

var pipeline = [ 
    { "$match": { "_id": { "$in": list } }}, 
    { "$project": { "weight": stack[0] }}, 
    { "$sort": { "weight": 1 } } 
]; 

db.collection.aggregate(pipeline); 

回答

0

问:why would you assign ref to list at i -1 , and not i?

我们,如果你想从数组访问f的采取下面的例子

var arr = [a,b,c,d,r,f]; 

console.log(arr.length); //This will give you 6 
console.log(arr.indexOf('a'));// Will give you 0. 

所以,你必须使用

var index = arr[arr.length-1]; 
console.log(index); //This will give `f`; 

希望你怀疑现在已清楚。

测试代码在这里:

var arr = ['a','b','c','d','e','f']; 
 
console.log(arr.length); 
 
console.log(arr.indexOf('a')); 
 

 
var len = arr.length; 
 
console.log(arr[len-1]); 
 
console.log(arr[len]);

+0

能您投票的答案呢? :) – Shrabanee