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

如何在MongoDB中查询指定文档数组内日期最新的元素?

原生Mongo CLI解决方案

实现逻辑

通过聚合管道分阶段处理,流程如下:

  1. $match阶段:筛选出_id匹配指定值的单个文档,缩小后续计算范围
  2. $unwind阶段:将文档内的throws数组拆分为独立子文档,每个子文档对应数组内的一个元素
  3. $sort阶段:按子文档的date字段降序排序,最新日期的子文档排在首位
  4. $limit阶段:仅保留排序后的第一条结果,即最新元素
  5. $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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 08:42:02