有没有办法在同一$项目中使用$ filter和$ sum?

时间:2016-11-15 03:25:51

标签: mongodb mongodb-query aggregation-framework

我们说我的聚合管道中有一个文档,如下所示:

<input type="hidden" name="sc-redirect" value="https://wpsimplepay.com/demo-success-page/">

我使用{ scores: [ {type: 'quiz', score: 75}, {type: 'quiz', score: 62}, {type: 'final', score: 34}, ] } 对其进行转换,并且我想获得测验分数的总和,有没有办法可以某种方式链接我的$project$filter

我知道我可能会使用两个$sum,但我现在设置管道的方式会迫使我继续在我的第二个项目中重新投入大量的密钥,我很喜欢避免。

2 个答案:

答案 0 :(得分:3)

您需要其他操作员的帮助,该操作员将嵌入文档的分数映射到您可以 $sum 的值数组中。您可以使用 $map 运算符执行此操作,如下所示:

db.test.aggregate([ 
    { 
        "$project": { 
            "scores": 1,
            "quiz_total": { 
                "$sum": {
                    "$map": { 
                        "input": "$scores", 
                        "as": "item", 
                        "in": { 
                            "$cond": [ 
                                { "$eq": [ "$$item.type", "quiz" ] }, 
                                "$$item.score", 
                                0 
                            ]
                        }
                    }
                }                
            }    
        }   
    }
])

示例输出

{
    "_id" : ObjectId("582ac9619602e37d2794acd3"),
    "scores" : [ 
        {
            "type" : "quiz",
            "score" : 75
        }, 
        {
            "type" : "quiz",
            "score" : 62
        }, 
        {
            "type" : "final",
            "score" : 34
        }
    ],
    "quiz_total" : 137
}

答案 1 :(得分:1)

YES!

db.collection.aggregate([ 
    { "$project": { 
        "totalQuiz": { 
            "$sum": { 
                "$filter": {
                    "input": "$score", 
                    "as": "s",
                    "cond": { "$eq": [ "$$s.type", "quiz" ] }
                }
             }
        }
    }
])