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
相关产品推荐
相关产品推荐

