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

MongoDB如何查询指定ip与process对应的连续失败次数

连续失败次数统计方案

核心逻辑:从最新记录开始按时间倒序遍历,遇到成功记录立即终止遍历,累计遍历到的失败记录数量即为最终结果,若第一条记录就是成功则直接返回0。

方案1:基于现有返回结果用业务代码统计

你现有查询已经返回了按日期倒序排列的type列表,直接遍历列表即可完成统计,以下是JS示例代码:

// 现有查询返回的结果
const typeList = activityLog.find([/* 你已写的查询条件 */]);
let failCount = 0;
for (const item of typeList) {
  if (item.type === 'success') {
    break;
  }
  failCount++;
}
// failCount 就是最终的连续失败次数

以你给出的示例数据集为例,查询返回的typeList按顺序为failure、failure、success,遍历前两项累计计数为2,第三项遇到success终止,结果符合预期。

方案2:直接在MongoDB聚合中完成统计(无需额外业务处理)

可以直接扩展你的聚合管道,一步拿到统计结果:

activityLog.aggregate([
  {
    $match: {
      ip: "1.1.1.1",
      process: "123"
    },
  },
  {
    $sort: {
      date: -1,
    },
  },
  {
    $limit: 10,
  },
  // 新增以下步骤完成统计
  {
    $group: {
      _id: null,
      typeList: { $push: "$type" }
    }
  },
  {
    $project: {
      _id: 0,
      continuousFailCount: {
        $reduce: {
          input: "$typeList",
          initialValue: 0,
          in: {
            $cond: [
              // 已经遇到过success就保持现有计数不变
              { $lt: ["$$value", 0] },
              "$$value",
              { $cond: [
                { $eq: ["$$this", "success"] },
                -1, // 用-1标记已经遇到过success,终止后续累加
                { $add: ["$$value", 1] }
              ]}
            ]
          }
        }
      }
    }
  },
  {
    // 把标记-1转换成0,对应最新记录是success的情况
    $project: {
      continuousFailCount: { $max: ["$continuousFailCount", 0] }
    }
  }
])

该查询会直接返回{continuousFailCount: 2}的结果,符合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 05:06:03