猫鼬递归查询父引用

Mongoose recursive query parent reference

本文关键字:引用 递归查询      更新时间:2023-09-26

我想做的正是这个mongoose的例子,但在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(' / ');

谢谢!

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此外,您可以使用path.unshift()将新项添加到数组的开头,而不是push将新项添加到path数组的末尾然后反转它。