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,虽然我有34,但顶层是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:如果孩子在同一个集合中,如何获取相关记录?的主要内容,如果未能解决你的问题,请参考以下文章

NodeJS + Mongo - 如何获取集合的内容?

在 mongo 集合中嵌入数组作为 Set(在数学意义上)

mongo 相关命令

mongo-> 如何从两个不同的集合中获取日期时间 desc 顺序的记录

如何在 java 中检查集合 mongo db? [复制]

在 Mongo 中,如何显示集合的索引? [复制]