聚合框架中的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"
                ]
            }
        }
    }
}
]