如何在MongoDB中查询指定文档数组内日期最新的元素?
原生Mongo CLI解决方案
实现逻辑
通过聚合管道分阶段处理,流程如下:
$match阶段:筛选出_id匹配指定值的单个文档,缩小后续计算范围$unwind阶段:将文档内的throws数组拆分为独立子文档,每个子文档对应数组内的一个元素$sort阶段:按子文档的date字段降序排序,最新日期的子文档排在首位$limit阶段:仅保留排序后的第一条结果,即最新元素$project阶段:调整输出结构,剔除不需要的字段,返回目标格式
代码示例
// 替换代码中的集合名、目标_id即可执行 db.getCollection('你的集合名').aggregate([ // 匹配指定_id的文档,注意字符串要转为ObjectId类型 { $match: { _id: ObjectId("61394b1dbccf101ef4f57517") } }, // 拆分throws数组 { $unwind: "$throws" }, // 按date降序排序 { $sort: { "throws.date": -1 } }, // 取第一条最新结果 { $limit: 1 }, // 调整输出为要求的结构 { $project: { _id: 0, date: "$throws.date", numberA: "$throws.numberA", numberB: "$throws.numberB", numberC: "$throws.numberC" } } ])
如果你的Mongo版本在5.2以上,可以使用$sortArray运算符简化写法,无需拆分数组,性能更高:
db.getCollection('你的集合名').aggregate([ { $match: { _id: ObjectId("61394b1dbccf101ef4f57517") } }, // 直接对throws数组按date降序排序,取第一个元素 { $project: { _id: 0, latest: { $first: { $sortArray: { input: "$throws", sortBy: { date: -1 } } } } } }, // 将根节点替换为最新元素,直接返回目标结构 { $replaceRoot: { newRoot: "$latest" } } ])
Mongoose解决方案
const YourModel = require('./你的模型路径'); async function getLatestThrow(targetId) { const result = await YourModel.aggregate([ { $match: { // Mongoose会自动将字符串_id转为ObjectId类型,无需手动转换 _id: targetId } }, { $unwind: "$throws" }, { $sort: { "throws.date": -1 } }, { $limit: 1 }, { $project: { _id: 0, date: "$throws.date", numberA: "$throws.numberA", numberB: "$throws.numberB", numberC: "$throws.numberC" } } ]); // aggregate返回结果为数组,取第一个元素即为目标数据 return result[0]; } // 调用示例 getLatestThrow("61394b1dbccf101ef4f57517").then(res => console.log(res));
高版本Mongo支持的$sortArray写法在Mongoose中可直接复用,和原生语法完全一致。
内容的提问来源于stack exchange,提问作者Chiqui Chexmo
相关产品推荐
相关产品推荐

