【问题标题】:Mongoose recursive query parent referenceMongoose 递归查询父引用
【发布时间】:2013-04-22 17:58:53
【问题描述】:

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

谢谢!

【问题讨论】:

    标签: javascript node.js mongodb mongoose


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-01
      • 2020-10-05
      • 1970-01-01
      • 2016-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多