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

MongoDB多子数组筛选:查询最后Temperatures事件为technicalFailure的文档

修正MongoDB查询以匹配最后一个Temperatures事件为technicalFailure的文档

原查询的问题

你之前的查询逻辑存在偏差:$filter同时筛选了category: "Temperatures"和event: "technicalFailure",这会直接过滤掉其他Temperatures类型的事件,无法判断所有Temperatures事件中的最后一个是否为technicalFailure,仅能确认存在该事件,不符合需求。

修正后的查询语句

写法一(使用$arrayElemAt)

{
  $and: [
    // 提前过滤掉不含Temperatures类别或technicalFailure事件的文档(可选,提升查询效率)
    { "transports.events.category": "Temperatures" },
    { "transports.events.event": "technicalFailure" },
    {
      $expr: {
        $eq: [
          // 提取所有Temperatures事件的最后一个的event字段
          {
            $getField: [
              "event",
              {
                $arrayElemAt: [
                  {
                    $filter: {
                      input: "$transports[0].events",
                      cond: { $eq: ["$$this.category", "Temperatures"] }
                    }
                  },
                  -1
                ]
              }
            ]
          },
          "technicalFailure"
        ]
      }
    }
  ]
}

写法二(使用$last简化语法)

{
  $and: [
    { "transports.events.category": "Temperatures" },
    { "transports.events.event": "technicalFailure" },
    {
      $expr: {
        $eq: [
          {
            $getField: [
              "event",
              {
                $last: {
                  $filter: {
                    input: "$transports[0].events",
                    cond: { $eq: ["$$this.category", "Temperatures"] }
                  }
                }
              }
            ]
          },
          "technicalFailure"
        ]
      }
    }
  ]
}

修正逻辑说明

  1. 先通过$filter筛选出所有category: "Temperatures"的事件,得到完整的Temperatures事件数组。
  2. 用$arrayElemAt: [..., -1]或$last获取该数组的最后一个元素(即所有Temperatures事件中的最后一个)。
  3. 提取该元素的event字段,判断是否等于"technicalFailure",以此匹配符合要求的文档。

验证结果

针对你提供的示例文档:

  • 文档123:Temperatures事件仅一个且为technicalFailure,符合条件,会被返回。
  • 文档456:Temperatures事件的最后一个是auto,不符合,不会被返回。
  • 文档127:Temperatures事件的最后一个是technicalFailure,符合条件,会被返回。
    完全匹配预期结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 16:04:53