MongoDB查询:按_id查找文档后返回同type字段的所有关联文档实现方案
实现方案
该需求完全可以实现,但不需要使用$group操作符完成需求。你之前尝试失败的核心原因是:如果先通过_id过滤仅得到单条文档,$group仅能对当前匹配到的单条文档做聚合,无法获取集合中其他同类型的文档。
推荐方案:使用MongoDB聚合管道一步完成查询
你可以通过4个聚合阶段实现需求,示例代码如下:
db.collection.aggregate([ // 第一阶段:匹配到用户查询的指定_id文档 { $match: { _id: "3" } }, // 第二阶段:自关联查询,匹配所有同type的文档 { $lookup: { from: "collection", // 替换为你的实际集合名 let: { targetType: "$type" }, // 存储当前查询到的文档的type值 pipeline: [ { $match: { $expr: { $eq: ["$type", "$$targetType"] } } } ], as: "sameTypeDocs" } }, // 第三阶段:拆分同类型文档数组为独立文档 { $unwind: "$sameTypeDocs" }, // 第四阶段:将同类型文档替换为返回结果的根节点 { $replaceRoot: { newRoot: "$sameTypeDocs" } } ])
执行上述语句后,会直接返回所有和查询_id同type的文档,完全符合你的需求。
更易理解的备选方案:两次查询
如果你对聚合管道不熟悉,也可以在业务代码中通过两次简单查询实现:
// 第一步:查询指定_id的文档,拿到type值 const targetDoc = await db.collection.findOne({ _id: "3" }); // 第二步:查询所有该type的文档 const result = await db.collection.find({ type: targetDoc.type }).toArray();
这种写法逻辑更直观,适合数据量不大的场景。
内容的提问来源于stack exchange,提问作者Vishal Sharma
相关产品推荐
相关产品推荐

