mongodb - 有什么办法可以在同一个 $project 中使用 $filter 和 $sum 吗?

标签 mongodb mongodb-query aggregation-framework

假设我的聚合管道中有一个如下所示的文档:

{
  scores: [
    {type: 'quiz', score: 75},
    {type: 'quiz', score: 62},
    {type: 'final', score: 34},
  ]
}

我正在使用 $project 对其进行转换,我想获得测验分数的总和,有没有办法以某种方式链接我的 $filter$sum

我知道我可能会使用两个 $project,但是我目前设置管道的方式会迫使我继续在我的第二个项目中重新投影大量 key ,我我想避免。

最佳答案

您需要另一个运算符的帮助,将分数嵌入文档映射到一个值数组中,您可以 $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
}

关于mongodb - 有什么办法可以在同一个 $project 中使用 $filter 和 $sum 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40601495/

相关文章:

c# - 如何使用 MongoDB 的 C# 驱动程序指定 Order 或 Sort?

node.js - 在 mongoDB 中获取具有 id 数组的集合中的对象

用于选择嵌入对象的 Mongodb 查询

mongodb - 对书籍进行分组并计算每个书籍的评分

$lookup 的 Mongodb 聚合参数必须是字符串

mongodb - 使用来自 Grijjy 的 DelphiMongoDB 对 MongoDB 进行身份验证

Ruby - 按时区对 MongoDB 记录进行排序?

MongoDB 不使用简单查询的不同索引

mongodb - 如何从mongoDB中的两个字段进行计数

mysql - mongodb 相当于 SELECT 字段 AS `anothername`