You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 03:27:03