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

如何用单条MongoDB查询获取每个分类的最新采购记录

获取MongoDB每个分类的最新采购记录

现有集合结构

[
  {
    category: "Groceries",
    items: [...],
    price: 30.0,
    purchased: "04-10-2022 17:52:35"
  },
  {
    category: "Groceries",
    items: [...],
    price: 11.0,
    purchased: "04-10-2022 18:52:35"
  },
  {
    category: "Cleaners",
    items: [...],
    price: 10.0,
    purchased: "04-10-2022 17:52:35"
  }
]

需求

通过单条查询获取每个category对应的最新采购记录,预期结果:

[
  {
    category: "Groceries",
    items: [...],
    price: 11.0,
    purchased: "04-10-2022 18:52:35"
  },
  {
    category: "Cleaners",
    items: [...],
    price: 10.0,
    purchased: "04-10-2022 17:52:35"
  }
]

解决方案

使用MongoDB聚合管道实现,具体查询代码如下:

db.collection.aggregate([
  // 将字符串格式的采购时间转为MongoDB可识别的日期类型
  {
    $addFields: {
      purchasedDate: {
        $dateFromString: {
          dateString: "$purchased",
          format: "%d-%m-%Y %H:%M:%S"
        }
      }
    }
  },
  // 按分类分组,筛选每组内最新的采购记录
  {
    $group: {
      _id: "$category",
      latestDate: { $max: "$purchasedDate" },
      latestRecord: {
        $first: {
          $cond: [{ $eq: ["$purchasedDate", "$latestDate"] }, "$$ROOT", null]
        }
      }
    }
  },
  // 还原原始文档结构,移除临时字段
  {
    $replaceRoot: {
      newRoot: {
        $mergeObjects: [
          "$latestRecord",
          { purchasedDate: "$$REMOVE" }
        ]
      }
    }
  }
])

关键说明

  • $dateFromString必须严格匹配原日期字符串的格式(这里是%d-%m-%Y %H:%M:%S),否则无法正确转换
  • 分组时通过$max拿到每组最新的采购日期,再用$cond和$first定位到对应日期的完整记录
  • 最后通过$replaceRoot和$mergeObjects清理临时字段,还原成需求的文档结构

内容的提问来源于stack exchange,提问作者Mike M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 17:10:28