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" ] } } ] }
修正逻辑说明
- 先通过
$filter筛选出所有category: "Temperatures"的事件,得到完整的Temperatures事件数组。 - 用
$arrayElemAt: [..., -1]或$last获取该数组的最后一个元素(即所有Temperatures事件中的最后一个)。 - 提取该元素的
event字段,判断是否等于"technicalFailure",以此匹配符合要求的文档。
验证结果
针对你提供的示例文档:
- 文档123:Temperatures事件仅一个且为technicalFailure,符合条件,会被返回。
- 文档456:Temperatures事件的最后一个是auto,不符合,不会被返回。
- 文档127:Temperatures事件的最后一个是technicalFailure,符合条件,会被返回。
完全匹配预期结果。
内容的提问来源于stack exchange,提问作者tboll
相关产品推荐
相关产品推荐

