2013-04-20 106 views
1

我正在尝试做这个mongo例子,但是在猫鼬中。在猫鼬中我似乎更加复杂。可能我正在尝试在一个圆孔中安装一个方形钉?猫鼬递归查询父亲参考

这个例子来自http://www.codeproject.com/Articles/521713/Storing-Tree-like-Hierarchy-Structures-With-MongoD(树形结构父参考)

我试图建立一个路径。

var path=[]; 
var item = db.categoriesPCO.findOne({_id:"Nokia"}); 
while (item.parent !== null) { 
    item=db.categoriesPCO.findOne({_id:item.parent}); 
    path.push(item._id); 
} 
path.reverse().join('/'); 

谢谢!

回答

1

猫鼬是一个异步库,所以

db.categoriesPCO.findOne({_id:"Nokia"}); 

没有答案返回到查询,它只是返回Query对象本身。为了实际运行查询,您需要将回调函数传递给findOne(),或者在返回的查询对象上运行exec()

db.categoriesPCO.findOne({_id:"Nokia"}, function (err, item) { 
}); 

但是,您不能使用while循环代码来生成路径,因此您需要使用递归来代替。像这样的东西应该工作:

var path=[]; 

function addToPath(id, callback) { 
    db.categoriesPCO.findOne({_id:id}, function (err, item) { 
     if (err) { 
      return callback(err); 
     } 
     path.push(item._id); 
     if (item.parent !== null) { 
      addToPath(item.parent, callback); 
     } 
     else { 
      callback(); 
     } 
    }); 
} 

addToPath("Nokia", function (err) { 
    path.reverse().join('/'); 
}); 

NB此外,代替push荷兰国际集团新项目到path数组的末尾,然后扭转它,你可以使用path.unshift()这增加了项目的开始阵列。