mongodb - 使用 MongoDB 中的聚合框架按特定嵌套字段值对文档进行计数

标签 mongodb mongodb-query aggregation-framework

这是我的数据库。

{
"_id" : ObjectId("579cab6c6aba30f42a57a979"),
"iecode" : "P1111",
"country" : "India",
"totalTreatmentArms" : 3,
"treatmentArms" : [ 
    {
        "mechanismOrPkg" : "Mechanism",
        "mechanism" : "mechanism1"
    }, 
    {
        "mechanismOrPkg" : "Mechanism",
        "mechanism" : "mechanism2"
    }, 
    {
        "mechanismOrPkg" : "Package",
        "mechanism" : "mechanism1"
    }
]
}


{
"_id" : ObjectId("579cab7a6aba30f42a57a97a"),
"iecode" : "P1111",
"country" : "Canada",
"totalTreatmentArms" : 3,
"treatmentArms" : [ 
    {
        "mechanismOrPkg" : "Mechanism",
        "mechanism" : "mechanism1"
    }, 
    {
        "mechanismOrPkg" : "Mechanism",
        "mechanism" : "mechanism2"
    }, 
    {
        "mechanismOrPkg" : "Package",
        "mechanism" : ""
    }
]
}


{
"_id" : ObjectId("579cabac6aba30f42a57a97b"),
"iecode" : "P2222",
"country" : "India",
"totalTreatmentArms" : 1,
"treatmentArms" : [ 
    {
        "mechanismOrPkg" : "Package",
        "mechanism" : ""
    }
]
}


{
"_id" : ObjectId("579cabe76aba30f42a57a97c"),
"iecode" : "P3333",
"country" : "India",
"totalTreatmentArms" : 2,
"treatmentArms" : [ 
    {
        "mechanismOrPkg" : "Mechanism",
        "mechanism" : "mechanism1"
    }, 
    {
        "mechanismOrPkg" : "Package",
        "mechanism" : ""
    }
]
}

请注意,有两 strip 有 iecode : P1111 的记录,我希望在 iecode 上区分结果,因此只考虑一条记录(任何一条)。

现在我的要求是我想要依赖字段mechanismOrPkg。如果它包含值Package,那么我们会将package加一。如果该值为 Mechanism,那么我们将考虑字段 mechanism 的值及其相关值计数。

所以最终的结果会是这样的

{
"_id" : null,
"totalPackage" : 3,
"totalMechanism1" : 2,
"totalMechanism2" : 1
}

请询问这听起来是否令人困惑。让我知道即使这种聚合可以通过查询实现还是我必须进行服务器端过滤?

谢谢。

编辑

mechanismOrPkg 的可能值:Package 或 Mechanism

机制的可能值:机制1或机制2

最佳答案

完成上述任务需要使用 $cond $sum 中的 运算符累加器运算符。 $cond 运算符将根据其第一个参数 (if) 评估逻辑条件,然后返回评估为 true 的第二个参数 (then) 或返回 false (else) 的第三个参数。这会将 true/false 逻辑转换为 1 和 0 数值,并输入 $sum分别。例如,当您想要聚合“Package”值的计数时,逻辑如下:

{
    "$sum": { 
        "$cond": [ { "$eq": [ "$treatmentArms.mechanismOrPkg", "Package" ] }, 1, 0 ]
    }
}

作为结果管道,您需要运行聚合操作

db.collection.aggregate([
    {
        "$group": {
            "_id": "$iecode",
            "treatmentArms": { "$first": "$treatmentArms" }
        }
    },
    { "$unwind": "$treatmentArms" },
    {
        "$group": {
            "_id": null,
            "totalPackage": { 
                "$sum": { 
                   "$cond": [ 
                       { "$eq": [ "$treatmentArms.mechanismOrPkg", "Package" ] }, 
                       1, 0
                    ] 
                }
            },
            "totalMechanism1":{
                "$sum": { 
                   "$cond": [ 
                        { 
                            "$and": [
                                { "$eq": [ "$treatmentArms.mechanismOrPkg", "Mechanism" ] },
                                { "$eq": [ "$treatmentArms.mechanism", "mechanism1" ] }
                            ]
                        }, 
                        1, 
                        0 ]
                }
            },
            "totalMechanism2": { 
                "$sum": { 
                   "$cond": [ 
                        { 
                            "$and": [
                                { "$eq": [ "$treatmentArms.mechanismOrPkg", "Mechanism" ] },
                                { "$eq": [ "$treatmentArms.mechanism", "mechanism2" ] }
                            ]
                        }, 
                        1, 
                        0 ]
                }
            }
        }
    }
])

示例输出

{
    "_id" : null,
    "totalPackage" : 3,
    "totalMechanism1" : 2,
    "totalMechanism2" : 1
}

关于mongodb - 使用 MongoDB 中的聚合框架按特定嵌套字段值对文档进行计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38693078/

相关文章:

javascript - MongoDB:如何避免集合中的名称 double

c# - 在 Mongo 中存储 Utc 和本地日期时间

mongodb在更新中设置null

mongodb - 在 MongoDB 中旋转数据

Mongodb 分组数据 - mapReduce 还是聚合?

MongoDB 聚合 - $project 和 $cond

node.js - docker 卷 : data lost when container is removed or stopped and then restarted

mongodb - mongodb 中日志分析数据库的最佳模式设计

javascript - 从 MongoDB 查询中只返回一个字段

MongoDB 聚合和投影