如何用MongoDB聚合管道筛选并返回指定字段最大值的文档?
MongoDB聚合管道解决方案:按分组保留最大字段值文档
现有Mongoose Schema定义
// mongoose schema format mongoose.Schema( { businessID: { type: String, index: true }, userID: { type: String, index: true }, userBusinessID: { type: Number, index: true }, data: { type: String }, } );
数据集
db.data.find({}) [ { businessID: 'B1', userID: 'U1', userBusinessID: 1, data: "hello1" }, { businessID: 'B1', userID: 'U1', userBusinessID: 2, data: "hello2" }, { businessID: 'B2', userID: 'U1', userBusinessID: 1, data: "hello4" }, { businessID: 'B1', userID: 'U2', userBusinessID: 1, data: "hello5" }, ]
期望结果(筛选userID为"U1",并保留每组最大userBusinessID的文档)
// Expected return data of userID "U1" [ { businessID: 'B1', userID: 'U1', userBusinessID: 2, // 同一businessID和userID下,返回userBusinessID更大的文档 data: "hello2" }, { businessID: 'B2', userID: 'U1', userBusinessID: 1, data: "hello4" } ]
聚合管道实现方案
通过4个阶段的聚合管道可实现需求逻辑:
- $match:过滤目标文档,减少后续处理数据量
- $sort:按分组字段升序、目标字段降序排序,确保同组内最大值文档排在首位
- $group:按
userID和businessID分组,取每组首个文档(即最大值对应文档) - $replaceRoot:将分组后嵌套的文档还原为顶层结构
完整聚合管道代码:
db.data.aggregate([ // 阶段1:匹配userID为U1的文档 { $match: { userID: "U1" } }, // 阶段2:按userID、businessID升序,userBusinessID降序排序 { $sort: { userID: 1, businessID: 1, userBusinessID: -1 } }, // 阶段3:按userID和businessID分组,取每组第一个文档 { $group: { _id: { userID: "$userID", businessID: "$businessID" }, maxDoc: { $first: "$$ROOT" } } }, // 阶段4:将嵌套的maxDoc还原为根文档 { $replaceRoot: { newRoot: "$maxDoc" } } ])
执行结果
执行上述管道后,返回结果与期望完全一致:
[ { "_id": ObjectId("..."), "businessID": "B1", "userID": "U1", "userBusinessID": 2, "data": "hello2" }, { "_id": ObjectId("..."), "businessID": "B2", "userID": "U1", "userBusinessID": 1, "data": "hello4" } ]
内容的提问来源于stack exchange,提问作者omkarstha
相关产品推荐
相关产品推荐

