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