MongoDB如何查询集合中year和week_number取值最高的全部文档
错误原因
你当前的查询写法不符合MongoDB聚合语法规则:$max是聚合运算符,无法直接在$match的$expr中这样使用,相当于没有配置有效过滤条件,所以会返回全量文档。
正确聚合查询写法
完整的聚合管道如下:
[ // 统计全集合的最大年份、最大周数,同时暂存所有原始文档 { $group: { _id: null, maxYear: { $max: "$year" }, maxWeek: { $max: "$week_number" }, docs: { $push: "$$ROOT" } } }, // 展开暂存的文档数组,变回单条文档结构 { $unwind: "$docs" }, // 过滤出符合「年份=最大年份且周数=最大周数」条件的文档 { $match: { $expr: { $and: [ { $eq: ["$docs.year", "$maxYear"] }, { $eq: ["$docs.week_number", "$maxWeek"] } ] } } }, // 还原原始文档的结构作为最终返回结果 { $replaceRoot: { newRoot: "$docs" } } ]
逻辑说明
先用$group一次性算出全集合最高的年份maxYear和最高周数maxWeek,同时把所有原始文档存入docs数组;展开数组后过滤同时满足两个最大值条件的文档,最后用$replaceRoot把原始文档还原成返回结果的根结构,就能得到所有符合要求的完整文档。
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

