如何在MongoDB聚合中同时返回过滤数据与唯一值
解决方案
你可以借助MongoDB的$facet阶段的多分支特性来实现需求——把获取唯一值的$group操作放到$facet的一个独立分支里,这样就能同时拿到过滤后的分页数据、元信息,以及指定属性的唯一值集合。
修改后的完整聚合管道如下:
[ { $project: { _id: 0, id: 1, uniqueId: 1, shortLabel: 1, "geographicLocation.name": 1, "economicConcept.name": 1, "frequency.name": 1, "scale.name": 1, "unit.name": 1, source: 1, }, }, { $match: { $and: [ { $or: [ { "geographicLocation.name": "United States" }, { "geographicLocation.name": "Singapore" }, ], }, { source: { $elemMatch: { name: { $regex: "New", $options: "i" }, }, }, }, ], }, }, { $facet: { metadata: [ { $count: "total" }, { $addFields: { page: 1 } }, ], data: [{ $skip: 0 }, { $limit: 10 }], distinct: [ { $group: { _id: null, distinctRegion: { $addToSet: "$geographicLocation.name" }, distinctFrequency: { $addToSet: "$frequency.name"}, distinctConcept: { $addToSet: "$economicConcept.name" } } } ] }, }, ]
说明:
metadata分支:保持原有逻辑,统计过滤后数据的总条数并添加当前页码data分支:保持原有分页逻辑,返回指定范围的过滤后数据distinct分支:新增的分支,通过$group将所有过滤后的文档聚合为一个,再用$addToSet收集指定字段的唯一值
执行这个管道后,你会得到包含三类结果的文档:分页数据集、元信息、指定属性的唯一值集合,完全满足你的需求。
内容的提问来源于stack exchange,提问作者Alex T
相关产品推荐
相关产品推荐

