Mongodb查找连续失败计数



我有一个这样的数据集:

{
ip: 1.1.1.1,
process: 123,
type: failure,
date: 2021-04-01
},
{
ip: 1.1.1.2,
process: 124,
type: failure,
date: 2021-03-01
},
{
ip: 1.1.1.1,
process: 123,
type: failure,
date: 2021-02-01
},
{
ip: 1.1.1.1,
process: 123,
type: success,
date: 2021-01-01
}

如何获取给定ip地址和进程的连续失败计数?例如,给定上面的数据集,如果我要检查在最后一次成功之前,进程123的ip 1.1.1.1失败了多少次,我应该得到2。但是,如果成功记录是最后一个记录,那么我应该得到0。

到目前为止,我拥有的是:

activityLog.find([
{
$match: {
ip: "1.1.1.1",
process: "123"
},
},
{
$sort: {
date: -1,
},
},
{
$limit: 10,
},
{
$project: {
_id: 0,
type: 1,
},
},
]);

这给了我一个所有类型的列表-排序和匹配的

您可以在聚合管道中执行以下操作:

  1. 查找以前的成功记录
  2. 执行自查找以查找上一个成功记录之后的失败记录
  3. 执行步骤2的查找计数
db.collection.aggregate([
{
$match: {
ip: "1.1.1.1",
process: "123",
type: "success"
}
},
{
"$sort": {
date: -1
}
},
{
$limit: 1
},
{
"$lookup": {
"from": "collection",
let: {
ip: "$ip",
process: "$process",
date: "$date"
},
pipeline: [
{
$match: {
$expr: {
$and: [
{
$eq: [
"$ip",
"$$ip"
]
},
{
$eq: [
"$process",
"$$process"
]
},
{
$lt: [
"$date",
"$$date"
]
},
{
$eq: [
"$type",
"success"
]
}
]
}
}
},
{
$sort: {
date: -1
}
},
{
$limit: 1
}
],
"as": "lastSuccess"
}
},
{
"$unwind": {
path: "$lastSuccess",
preserveNullAndEmptyArrays: true
}
},
{
"$lookup": {
"from": "collection",
let: {
ip: "$ip",
process: "$process",
date: {
$ifNull: [
"$lastSuccess.date",
ISODate("9999-12-31")
]
}
},
pipeline: [
{
$match: {
$expr: {
$and: [
{
$eq: [
"$ip",
"$$ip"
]
},
{
$eq: [
"$process",
"$$process"
]
},
{
$gte: [
"$date",
"$$date"
]
},
{
$eq: [
"$type",
"failure"
]
}
]
}
}
}
],
"as": "previousFailures"
}
},
{
"$addFields": {
"lastFailuresCount": {
$size: "$previousFailures"
}
}
}
])

这是Mongo游乐场供您参考

最新更新