Mongoose递归查询父引用

时间:2013-04-20 10:05:34

标签: javascript node.js mongodb mongoose

我正在努力做这个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(' / ');

谢谢!

1 个答案:

答案 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}}数组。项目到数组的开头。