Mongoose聚合实现对象数组过滤与降序排序求助
解决方案
你的MongoDB版本是5.0.9,而$sortArray是MongoDB 5.2及以上才引入的操作符,所以用不了。可以通过展开数组-过滤-排序-重新聚合的方式实现需求,具体步骤如下:
步骤说明
$unwind展开数组:将articles数组拆分为独立的文档,方便后续排序和过滤$match过滤数据:筛选出article_dt小于指定日期的文档$sort排序:按article_dt降序排列$group重新聚合:将拆分后的文档重新组合为数组,并保留原文档的title字段
完整代码示例
let paramDate = new Date(); // 替换为你的目标日期 Book.aggregate([ // 展开articles数组 { $unwind: "$articles" }, // 过滤符合日期条件的子文档 { $match: { "articles.article_dt": { $lt: paramDate } } }, // 按article_dt降序排序 { $sort: { "articles.article_dt": -1 } }, // 重新组合为数组,保留title和排序后的articles { $group: { _id: "$_id", title: { $first: "$title" }, articles: { $push: "$articles" } } } ]) .then(result => { console.log(result); }) .catch(err => { console.error(err); });
额外注意事项
- 你的Schema定义里存在两处错误:
- 类型关键字应该是大写的
String/Date,不是小写的string/date - 定义Model时用了
orderSchema,但实际Schema变量是x,应该改为Book = mongoose.model('Book', x);
- 类型关键字应该是大写的
- 注意字段名一致性:Schema里写的是
article_date,但数据和查询里用的是article_dt,要统一成同一个字段名,否则查询会失效
内容的提问来源于stack exchange,提问作者Tozzen
相关产品推荐
相关产品推荐

