使用mongoose模式递归地获取所有子项

时间:2016-11-25 03:39:07

标签: node.js mongodb express mongoose mongoose-schema

我正在使用带有mongoose的express框架,我有以下架构:

var DocumentSchema = new Schema({
    name: String,
    description: String,
    parent: {
        type: Schema.Types.ObjectId,
        ref: "Document"
    },
    children: [{
        type: Schema.Types.ObjectId,
        ref: 'Document'
    }]
});

我正在尝试获得一个动态的儿童层次结构树,但我找不到合适的解决方案。

是否可以使用此架构执行此操作?如果没有,我应该使用什么模式结构?

1 个答案:

答案 0 :(得分:1)

我不确定孩子的等级树是什么意思。所需数据输出的一个例子会很有帮助。

如果您需要使用您的架构将特定节点的所有后代加载到平面结构中,您可以使用以下内容:

getAllChildNodes(startNodeId, callback) {
  const tree = [];
  let idsToLoad = [];

  yourModel.findOne({_id: startNodeId }).exec((err, node) => {
    tree.push(node);
    idsToLoad = node.children;
    let count = 0;

    async.whilst(
      () => {
        return count < idsToLoad.length
      },
      (cb) => {
        yourModel.findOne({_id: idsToLoad[count] }).exec((err, doc) => {
          tree.push(doc);
          idsToLoad = idsToLoad.concat(doc.children);
          count++;
          cb();
        });
      },
      (err) => {
        if (err) {
          console.error(err);
          return callback(err);
        }
        return callback(null, tree);
      }
    );

  });
}

这可能是一个非常昂贵的查询,效率不高。如果这是您的主要用例,我不建议使用此模式类型。如果您的数据是静态的,我会考虑使用Materialized PathsNested Sets