我正在努力做这个mongo示例正在做的事情,但是在mongoose中。猫鼬对我来说似乎更复杂。可能我试图在一个圆孔中安装一个方形钉?
此示例来自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(' / ');
谢谢!
答案 0 :(得分:1)
Mongoose是一个异步库,所以
db.categoriesPCO.findOne({_id:"Nokia"});
不返回查询的答案,它只返回一个Query对象本身。为了实际运行查询,您需要将回调函数传递给findOne()
或在返回的Query对象上运行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()
数组放在{{1}}数组的末尾,而不是{{1}}数组。项目到数组的开头。