聚合框架中的Mongodb$cond
我有一个包含如下文档的集合: { } 这里是我试图编写的聚合查询,我想做的(请参阅注释掉的部分)是为 “原因/错误”代码,但仅当原因代码以特定字母开头,并且只添加一次代码时,我尝试了以下操作:聚合框架中的Mongodb$cond,mongodb,Mongodb,我有一个包含如下文档的集合: { } 这里是我试图编写的聚合查询,我想做的(请参阅注释掉的部分)是为 “原因/错误”代码,但仅当原因代码以特定字母开头,并且只添加一次代码时,我尝试了以下操作: db.aggregate([ {$group: { _id: "$ipAddr", attempts: {$sum:1}, results: {$push: "$finalGrade"}, // errorCode
db.aggregate([
{$group:
{ _id: "$ipAddr",
attempts: {$sum:1},
results: {$push: "$finalGrade"},
// errorCodes: {$addToSet: {$cond: ["$results.Reason": /[A|B|S|N.*/, "$results.Reason", ""]}},
finalResult: {$last: "$finalGrade"} }
}
]);
除了注释掉的“errorCodes”行之外,一切正常。我试图创建的逻辑是:
“添加错误代码设置结果的值。如果原因代码以A、B、S或N开头,则不需要添加任何内容”
对于上述记录,错误代码集应包含:... 错误代码:[S1002,A1001],
…
$group
不能接受条件表达式,这就是该行不起作用的原因$project
是一个阶段,在此阶段,您可以基于传统表达式(以及其他内容)转换原始文档
在聚合管道中需要两个步骤才能$group
-首先需要$unwind
结果数组,然后需要$match
筛选出不关心的结果
这可以做一件简单的事情,只需将结果与错误代码一起抛出,而您并不关心保留这些错误代码,但听起来您想计算失败的总数,包括所有错误代码,然后只将特定的错误代码添加到输出数组中?没有直接的方法可以做到这一点,您必须在管道中进行两次$group
$unwind
过程
类似于此的方法也可以:
db.aggregate([
{$unwind : "$results"},
{$group:
{ _id: "$ipAddr",
attempts: {$sum:1},
results: {$push : "$results"},
finalGrade: {$last : "$finalGrade" }
}
},
{$unwind: "$results"},
{$match: {"results.Reason":/yourMatchExpression/} },
{$group:
{ _id: "$ipAddr",
attempts: {$last:"$attempts"},
errorCodes: {$addToSet: "$results.Reason"},
finalResult: {$last: "$finalGrade"}
}
]);
如果您只想计算具有匹配错误代码的尝试次数,则可以使用单个
$group
-您需要执行$unwind
、$match
和$group
。您可以将$project与$cond
一起使用,但是错误代码数组将有一个空字符串条目以及所有正确的错误代码。从Mongo 2.4开始,$regex可以用于模式匹配,但不能作为返回布尔值的表达式,这是$cond所要求的
然后,您可以使用$match运算符使用$regex关键字:
或者可以使用$substr,因为模式匹配非常简单
db.aggregate([
{$unwind : "$results"},
{$group:
{ _id: "$ipAddr",
attempts: {$sum:1},
results: {$push : "$results"},
finalGrade: {$last : "$finalGrade" }
}
},
{$unwind: "$results"},
{$match: {"results.Reason":/yourMatchExpression/} },
{$group:
{ _id: "$ipAddr",
attempts: {$last:"$attempts"},
errorCodes: {$addToSet: "$results.Reason"},
finalResult: {$last: "$finalGrade"}
}
]);
[
{
"$unwind": "$results"
},
{
"$match": {
"results.Reason": {
"$regex": "[SA].*"
}
}
},
{
"$group": {
"_id": "$ipAddr",
"attempts": {
"$sum": 1
},
"results": {
"$push": "$finalGrade"
},
"undefined": {
"$last": "$finalGrade"
},
"errorCodes": {
"$addToSet": "$results.Reason"
}
}
}
]
[
{
"$unwind": "$results"
},
{
"$group": {
"_id": "$ipAddr",
"errorCodes": {
"$addToSet": {
"$cond": [
{
"$or": [
{
"$eq": [
{
"$substr": [
"$results.Reason",
0,
1
]
},
"A"
]
},
{
"$eq": [
{
"$substr": [
"$results.Reason",
0,
1
]
},
"S"
]
}
]
},
"$results.Reason",
"null"
]
}
}
}
}
]