Mongooserecursion查询父引用

我正在尝试做这个mongo例子,但是在mongoose中。 mongoose似乎更为复杂。 可能我正在试图在一个圆形孔中安装一个方形钉?

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

我试图build立一条path。

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(' / '); 

谢谢!

Mongoose是一个asynchronous库,所以

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

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

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

但是,您不能使用while循环代码来生成path,所以您需要使用recursion。 像这样的东西应该工作:

 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()将项目添加到数组的开头。