【问题标题】:Get all parent documents in a mongoDB model tree structure获取 mongoDB 模型树结构中的所有父文档
【发布时间】:2015-09-20 18:19:30
【问题描述】:

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

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"

【问题讨论】:

标签: javascript mongodb meteor mongodb-query


【解决方案1】:

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

有了一个祖先数组,你的文档树看起来像:

{
    "_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 }]});

【讨论】:

  • 我只是在想,因为我想以这种方式对待文章的 cmets。这意味着可以有 3-4 层深度,即 10 cmets。这意味着一篇文章有​​ 40 个 DB 查询任务。对我来说这听起来很糟糕。
  • 那么祖先数组可能是更好的选择。
  • 能否请您在示例中显示我必须更改的内容?
  • 查看答案的变化
  • 我不需要祖先和父母?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-16
  • 2013-02-20
  • 2020-09-28
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多