如何用单条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
相关产品推荐
相关产品推荐

