MongoDB聚合分组后排序出现Token错误求助
MongoDB 按年月分组后排序的正确聚合写法
错误原因分析
你的语法错误核心是聚合阶段的数组结构写错了:MongoDB的aggregate()方法接收的是一个阶段数组,每个阶段必须是数组中的独立对象,不能把$group和$sort放在同一个大括号里。
你之前的写法里,把$group和$sort嵌套在同一个对象中,违反了JSON语法规则(一个对象不能有多个顶级的$group、$sort键),所以会报Unexpected token错误。另外,分组后year和month存在于_id对象下,直接用year:1排序找不到对应字段,必须用"_id.year"来引用。
正确的聚合查询写法
db.xxxx.aggregate([ { $group: { _id: { year: { $year: "$createdDate" }, month: { $month: "$createdDate" } }, total_users: { $sum: 1 } } }, { $sort: { "_id.year": 1, // 按年份升序 "_id.month": 1 // 按月份升序 } } ])
关键说明
- 阶段数组结构:每个聚合阶段(
$group、$sort)都是数组中的独立对象,用逗号分隔,整个数组包裹在[]中。 - 排序字段引用:分组后的文档里,年份和月份属于
_id的子字段,排序时必须通过"_id.year"、"_id.month"指定。 - 多余逗号清理:原分组查询中
$group对象结束后有个多余的逗号,虽然部分解析器能兼容,但建议去掉以避免潜在语法问题。
内容的提问来源于stack exchange,提问作者MetaCoder
相关产品推荐
相关产品推荐

