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

MongoDB聚合阶段提取指定状态时间并保留原Log数组方案咨询

MongoDB聚合:提取Start状态时间或使用当前时间(不使用$unwind)

解决方案聚合管道

db.collection.aggregate([
  {
    $addFields: {
      startLogItem: {
        $arrayElemAt: [
          {
            $filter: {
              input: "$Log",
              cond: { $eq: ["$$this.status", "Start"] }
            }
          },
          0
        ]
      }
    }
  },
  {
    $addFields: {
      StartTime: {
        $ifNull: [
          "$startLogItem.time",
          { $dateToString: { format: "%m/%d/%Y %H:%M:%S", date: new Date() } }
        ]
      }
    }
  },
  {
    $project: {
      StartTime: 1,
      Log: 1,
      _id: 0
    }
  }
])

各阶段说明

  • 第一个$addFields:通过$filter筛选Log数组中status为"Start"的元素,再用$arrayElemAt取第一个匹配项存入临时字段startLogItem,完全保留原Log数组。
  • 第二个$addFields:用$ifNull做判断:如果startLogItem存在,直接提取它的time值;如果不存在,用$dateToString将当前时间转为和示例中一致的格式(MM/DD/YYYY HH:MM:SS)。
  • $project:仅保留需要的StartTime和原Log字段,移除临时字段与默认_id。

格式调整说明

如果需要ISO格式的当前时间,可将$dateToString部分替换为$now(MongoDB 4.0+支持),直接生成ISO标准时间字符串。

输出示例

  • 存在Start状态的文档输出:
{
  "StartTime": "09/02/2023 06:17:51",
  "Log": [/* 原完整Log数组 */]
}
  • 无Start状态的文档输出:
{
  "StartTime": "09/15/2024 14:30:00",
  "Log": [/* 原完整Log数组 */]
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 04:03:35