MongoDB查询:筛选按soldDate排序的最后一条sale状态为2的item文档
MongoDB查询实现方案
需求说明
筛选所有sales数组按soldDate字段升序排序后,最后一条销售记录status值等于2的item文档。
实现方案
方案1:MongoDB 5.2+ 简洁写法(推荐)
直接使用$sortArray运算符完成数组内排序,无需拆分重组数组:
db.items.aggregate([ { $match: { $expr: { $eq: [ // 直接取按销售日期升序后最后一条记录的status字段 { $last: { $sortArray: { input: "$sales", sortBy: { soldDate: 1 } } } }.status, 2 ] } } } ])
方案2:低版本MongoDB兼容写法
如果使用的MongoDB版本低于5.2,不支持$sortArray,可以用拆分数组+排序+重组的方式实现:
db.items.aggregate([ // 拆分sales数组为单条记录 { $unwind: "$sales" }, // 按item主键、销售日期升序排序 { $sort: { item: 1, "sales.soldDate": 1 } }, // 按item分组,重组sales数组,同时记录最后一条的status { $group: { _id: "$_id", item: { $first: "$item" }, sales: { $push: "$sales" }, lastStatus: { $last: "$sales.status" } } }, // 筛选最后一条status等于2的文档 { $match: { lastStatus: 2 } }, // 去掉临时字段,返回和原结构一致的结果 { $unset: "lastStatus" } ])
结果验证
针对你提供的测试数据,以上两种查询都会返回item:1和item:3两个符合要求的文档,和预期结果完全一致。
内容的提问来源于stack exchange,提问作者RedTailedHawk
相关产品推荐
相关产品推荐

