1

I am trying to do exactly what this mongo example is doing but in mongoose. It seems more complex to me in mongoose. Possibly i'm trying to fit a square peg in a round hole?

This example is from http://www.codeproject.com/Articles/521713/Storing-Tree-like-Hierarchy-Structures-With-MongoD (tree structure with parent reference)

I'm trying to build a 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(' / ');

Thanks!

4

1 回答 1

1

Mongoose 是一个异步库,所以

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

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

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

注意此外,您可以使用which 将新项目添加到数组的开头,而不是将push新项目添加到path数组的末尾然后反转它。path.unshift()

于 2013-04-22T09:58:53.513 回答