【问题标题】:Mongo: How to get related record if child in the same collection?Mongo:如果孩子在同一个集合中,如何获取相关记录?
【发布时间】:2020-02-12 14:07:09
【问题描述】:

数据结构的简化示例是

{ _id: ObjectId, parentId: ObjectId } 

其中父级的parentId 为空白,所有子级的parentId 指向同一集合中的顶级记录。

我有一个 ID 数组,可以是父 或 子 ID,我需要检索所有父记录。

因此,如果 ID 是针对父母的,那就凉快吧。

如果给定 ID 指向具有parentId 的记录,则检索具有_id === parentId 的记录。

最后,我不能有重复项,所以如果我有一个子 ID 指向我已经拥有的父记录(因为我明确地获得了 ID),只需获取唯一的父记录。

所以我可以有这样的查询:

query: { _id: {$in: [2,3,4]}}

像

这样的数据
_id  |   parentId 
1    |   undefined
2    |   1
3    |   undefined
4    |   3

应该返回1, 3 的记录,因为2 指向1,虽然我有3 和4,但顶层是3。

【问题讨论】:

  • 有什么理由不能简单地搜索所有未定义 parentId 的记录?这样的查询不会返回所有父记录吗?

标签: mongodb linked-list aggregate aggregate-functions


【解决方案1】:

如果给定 ID 指向具有 parentId 的记录,则检索具有 _id === parentId 的记录。

可以使用聚合管道的$lookup 阶段检索这些记录:

$lookup:
     {
       from: <collection name>,
       localField: parentId,
       foreignField: _id,
       as: parentObj
     }

我不能有重复项,所以如果我有一个子 ID 指向我已经拥有的父记录(因为我明确地获得了 ID),只需获取唯一的父记录。

聚合管道与distinct 并没有很好地结合。根据您的实施,您可以使用$group 阶段作为解决方法,如this question 所示。

【讨论】:

    猜你喜欢
    • 2012-06-01
    • 2019-09-14
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    • 1970-01-01
    • 2021-09-19
    • 2018-06-27
    • 1970-01-01
    相关资源
    最近更新 更多