Mongo:如果孩子在同一个集合中,如何获取相关记录?
Posted
技术标签:
【中文标题】Mongo:如果孩子在同一个集合中,如何获取相关记录?【英文标题】:Mongo: How to get related record if child in the same collection? 【发布时间】: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 的记录?这样的查询不会返回所有父记录吗? 【参考方案1】:如果给定 ID 指向具有
parentId
的记录,则检索具有_id === parentId
的记录。
可以使用聚合管道的$lookup
阶段检索这些记录:
$lookup:
from: <collection name>,
localField: parentId,
foreignField: _id,
as: parentObj
我不能有重复项,所以如果我有一个子 ID 指向我已经拥有的父记录(因为我明确地获得了 ID),只需获取唯一的父记录。
聚合管道与distinct
并没有很好地结合。根据您的实施,您可以使用$group
阶段作为解决方法,如this question 所示。
【讨论】:
以上是关于Mongo:如果孩子在同一个集合中,如何获取相关记录?的主要内容,如果未能解决你的问题,请参考以下文章