如何在MongoDB中使用aggregate实现多记录分组?现有查询替代方案咨询
MongoDB聚合查询替代方案
你当前的聚合语句是按instituteBenchMarkId分组,将同组内所有记录的element和startDate存入数组。针对不同的业务需求,有以下几个可行的替代方案:
方案1:同分组下element去重(自动过滤重复element条目)
如果你的核心需求是避免同一个instituteBenchMarkId下出现重复的element值,可以把$push替换为$addToSet,适合不需要保留重复element的场景:
db.getCollection('business_portfolio_attributes').aggregate([ {$match: { category: "BS"}}, {$group: { _id: "$instituteBenchMarkId", elements:{ $addToSet: { "element": "$element", "startDate": "$startDate" } } }} ])
注意:
$addToSet是对整个对象(element+startDate的组合)去重,如果只要按element字段单独去重,可使用两层分组的写法,先按instituteBenchMarkId+element分组取对应startDate,再汇总到instituteBenchMarkId维度:
db.getCollection('business_portfolio_attributes').aggregate([ {$match: { category: "BS"}}, // 第一层分组:按基准ID+element去重,这里取最新的startDate,可根据需求调整为$first/$min等 {$group: { _id: { instituteBenchMarkId: "$instituteBenchMarkId", element: "$element" }, startDate: {$max: "$startDate"} }}, // 第二层分组:按基准ID汇总所有element {$group: { _id: "$_id.instituteBenchMarkId", elements: { $push: { element: "$_id.element", startDate: "$startDate" } } }} ])
方案2:直接查询后在业务代码中分组
如果你的数据集量级很小(小于1万条),也可以直接过滤查询后在代码里分组,写法更灵活,方便后续扩展逻辑:
// MongoDB查询语句 const records = db.getCollection('business_portfolio_attributes').find({category: "BS"}).toArray() // 代码分组示例(JS为例) const result = {} records.forEach(item => { const key = item.instituteBenchMarkId.toString() if(!result[key]) result[key] = {instituteBenchMarkId: item.instituteBenchMarkId, elements: []} result[key].elements.push({element: item.element, startDate: item.startDate}) })
方案3:追加返回更多关联字段
如果需要在elements数组里同时返回attributeValue、reportId等其他字段,直接在分组的$push里加对应字段即可,不需要调整整体结构:
db.getCollection('business_portfolio_attributes').aggregate([ {$match: { category: "BS"}}, {$group: { _id: "$instituteBenchMarkId", elements:{ $push: { "element": "$element", "startDate": "$startDate", "attributeValue": "$attributeValue", "reportId": "$reportId" } } }} ])
内容的提问来源于stack exchange,提问作者Vasudha Sood
相关产品推荐
相关产品推荐

