我正在使用带有mongoose的express框架,我有以下架构:
var DocumentSchema = new Schema({
name: String,
description: String,
parent: {
type: Schema.Types.ObjectId,
ref: "Document"
},
children: [{
type: Schema.Types.ObjectId,
ref: 'Document'
}]
});
我正在尝试获得一个动态的儿童层次结构树,但我找不到合适的解决方案。
是否可以使用此架构执行此操作?如果没有,我应该使用什么模式结构?
答案 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 Paths或Nested Sets。