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

Mongoose聚合实现对象数组过滤与降序排序求助

解决方案

你的MongoDB版本是5.0.9,而$sortArray是MongoDB 5.2及以上才引入的操作符,所以用不了。可以通过展开数组-过滤-排序-重新聚合的方式实现需求,具体步骤如下:

步骤说明

  1. $unwind展开数组:将articles数组拆分为独立的文档,方便后续排序和过滤
  2. $match过滤数据:筛选出article_dt小于指定日期的文档
  3. $sort排序:按article_dt降序排列
  4. $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定义里存在两处错误:
    1. 类型关键字应该是大写的String/Date,不是小写的string/date
    2. 定义Model时用了orderSchema,但实际Schema变量是x,应该改为Book = mongoose.model('Book', x);
  • 注意字段名一致性:Schema里写的是article_date,但数据和查询里用的是article_dt,要统一成同一个字段名,否则查询会失效

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 15:30:21