MongoDB聚合查询$lookup后无法保留locator和record字段问题
解决MongoDB $lookup后丢失原字段的问题
嗨,我来帮你搞定这个聚合查询的问题!你遇到的核心问题是:在使用$unwind和$group之后,原集合sample里的locator和record字段消失了——这是因为你在$group阶段只指定了_id和metalocator两个字段,没有把需要保留的原字段包含进去。
下面给你两种可行的解决方案,适配不同的关联场景:
方法一:在$group中保留原字段(适合一对多关联)
如果你的sample文档可能对应多个locators文档(一对多关系),可以用$first操作符在$group阶段保留locator和record(因为同一个_id对应的这两个字段值是唯一的,$first会正确获取到它们):
data = db.sample.aggregate([ {"$lookup": { "from": "locators", "localField": "locator", "foreignField": "_id", "as": "metalocator" }}, {"$unwind": '$metalocator'}, {"$group": { "_id": "$_id", "locator": {"$first": "$locator"}, # 保留原locator字段 "record": {"$first": "$record"}, # 保留原record字段 "metalocator": {"$push": { "section": "$metalocator.section", "cabinet": "$metalocator.cabinet" }} }} ]) print(list(data))
方法二:用$map重构数组(适合一对一关联,更高效)
从你的示例数据来看,每个sample文档只对应一个locators文档(一对一关系),这种情况下完全不需要$unwind和$group,直接用$project配合$map来修改metalocator数组的结构即可,性能更优:
data = db.sample.aggregate([ {"$lookup": { "from": "locators", "localField": "locator", "foreignField": "_id", "as": "metalocator" }}, {"$project": { "locator": 1, # 显式保留原字段 "record": 1, "metalocator": { "$map": { "input": "$metalocator", "as": "ml", "in": { "section": "$$ml.section", "cabinet": "$$ml.cabinet" } } } }} ]) print(list(data))
这两种方法都能返回你期望的结果,既保留了sample集合的locator和record字段,又把metalocator精简成只包含section和cabinet的数组。
内容的提问来源于stack exchange,提问作者Ninja Warrior 11
相关产品推荐
相关产品推荐

