javascript - 获取mongoDB模型树结构中的所有父文档

标签 javascript mongodb meteor mongodb-query

我正在为我的集合使用模型树结构。作为引用,我使用父字段。我需要从当前对象及其所有父对象获取属性。路径中的最后一个元素有一个字段“target”。所以我从

var result = parent = Articles.findOne({target: this.params._id});

do {
    parent = Articles.findOne({_id: parent.parent}).parent;
    for (var attrname in parent) { result[attrname] = parent[attrname]; }
}
while (parent.parent === null);

这对我来说似乎效率很低。是否可以用一行来获取包含所有元素的对象?然后我就可以处理该对象。

示例文档

{
    "_id" : "LD6h5ZcDuJjexfKfx",
    "title" : "title",
    "publisher" : "public",
    "author" : "author"
}
{
    "_id" : "KSiyh8zHRq8RZQ2E6",
    "edition" : "edition",
    "year" : "2020",
    "parent" : "LD6h5ZcDuJjexfKfx"
}
{
    "_id" : "5yCk4y25wrLBLZhyY",
    "pageNumbers" : "1-10",
    "target" : "9sjhzPhyTuQ5Kbh6v",
    "parent" : "KSiyh8zHRq8RZQ2E6"
}

因此,从 "target": "9sjhzPhyTuQ5Kbh6v" 开始,我想获取两个父文档(在本例中)。

至少我需要数据集

"title" : "title",
"publisher" : "public",
"author" : "author",
"edition" : "edition",
"year" : "2020",
"pageNumbers" : "1-10"

最佳答案

如果您想在单个查询中执行此操作,那么您需要遵循 array of ancestors Mongodb 中的模式。否则,您需要像您所做的那样递归遍历叶节点上方的分支。对于像您这样的深度较低的层次结构,这并不是一个很大的惩罚。

有了祖先数组,您的文档树将如下所示:

{
    "_id" : "LD6h5ZcDuJjexfKfx",
    "title" : "title",
    "publisher" : "public",
    "author" : "author",
}
{
    "_id" : "KSiyh8zHRq8RZQ2E6",
    "edition" : "edition",
    "year" : "2020",
    "ancestors" : ["LD6h5ZcDuJjexfKfx"],
    "parent" : "LD6h5ZcDuJjexfKfx"
}
{
    "_id" : "5yCk4y25wrLBLZhyY",
    "pageNumbers" : "1-10",
    "target" : "9sjhzPhyTuQ5Kbh6v",
    "ancestors" : ["LD6h5ZcDuJjexfKfx","KSiyh8zHRq8RZQ2E6"],
    "parent" : "KSiyh8zHRq8RZQ2E6"
}

获取文档及其父级:

Articles.find({ $or: [ { target: target },
  _id: { $in: Articles.findOne({ target: target }).ancestors }]});

关于javascript - 获取mongoDB模型树结构中的所有父文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32682744/

相关文章:

javascript - 如何为对象的所有实例调用对象函数

javascript - 在与其他对象参数相同的对象中使用的对象参数?

mongodb - 我们如何使用spring boot为mongodb创建自动生成的字段

node.js - 使用 Mongoose 嵌入文档的建模引用

meteor - Meteor 的 Deny/Allow 回调从哪里接收参数内容?

javascript - 使用多级键过滤文本的 Angular 管

javascript - DataTable.js - 自动初始化

angularjs - 如何在一个 app.get 请求中返回多个 Mongodb 集合?

javascript - Meteor - 如何在模板事件函数中正确路由

javascript - 在我的 meteor 应用程序上添加 Google map