MongoDB分组时限制$$ROOT仅保留前10条数据的实现问题
MongoDB 6.0.1分组时保留每组前10条数据的正确语法
针对你的需求,直接在$group阶段通过$push结合$slice即可实现只保留每组前10条$$ROOT数据,避免内存超限问题。以下是正确的实现方式:
完整聚合示例
db.collection.aggregate([ // 可选:如果需要按特定顺序保留前10条,先执行排序(比如按创建时间倒序) { $sort: { createTime: -1 } // 根据你的实际需求调整排序字段和顺序 }, { $group: { _id: { DOG_RACE: '$DOG_RACE', FOOD: '$FOOD' }, total: { $count: {} }, _raw: { $push: { $each: ['$$ROOT'], $slice: 10 // 只保留前10条数据 } } } } ])
错误原因说明
- 直接用
$slice作为_raw的定义:$group阶段要求字段值必须是累加器对象(如$push、$sum、$count等),$slice是数组操作符,不能单独作为累加器使用,因此报错。 - 使用
$firstN报错:$firstN作为聚合阶段可以单独使用,但作为累加器在$group中时,MongoDB 6.0.1的语法要求是{ $firstN: { n: 10, input: '$$ROOT' } },不过该累加器在部分场景下兼容性不如$push+$slice,且如果未正确排序,返回的结果顺序可能不符合预期。
内容的提问来源于stack exchange,提问作者Thibaud
相关产品推荐
相关产品推荐

