Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用MongoDB中的聚合框架按特定嵌套字段值统计文档_Mongodb_Mongodb Query_Aggregation Framework - Fatal编程技术网

使用MongoDB中的聚合框架按特定嵌套字段值统计文档

使用MongoDB中的聚合框架按特定嵌套字段值统计文档,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,这是我的数据库 { "_id" : ObjectId("579cab6c6aba30f42a57a979"), "iecode" : "P1111", "country" : "India", "totalTreatmentArms" : 3, "treatmentArms" : [ { "mechanismOrPkg" : "Mechanism", "mechanism" : "mechanism1" }, { "me

这是我的数据库

{
"_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" : ""
    }
]
}
请注意,
iecode:P1111
有两条记录,我希望在
iecode
上区分结果,因此只考虑一条记录(任何一条)

现在我的要求是我想依靠field
mechanismOrPkg
。如果它包含值
Package
,那么我们将用一个值递增
Package
。如果值是“代码>机制< /代码>,那么我们将考虑字段<代码>机制< /COD>的值,并考虑其尊重的值计数。

所以最终的结果是这样的

{
"_id" : null,
"totalPackage" : 3,
"totalMechanism1" : 2,
"totalMechanism2" : 1
}
请问这听起来是否令人困惑。让我知道,即使这种聚合可以通过查询实现,或者我必须进行服务器端过滤

谢谢

编辑

{
    "_id" : null,
    "totalPackage" : 3,
    "totalMechanism1" : 2,
    "totalMechanism2" : 1
}
mechanismOrPkg的可能值:包装或机制


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

完成上述操作需要在累加器操作符中使用操作符。运算符将根据其第一个参数(if)计算逻辑条件,然后返回第二个参数,其中计算结果为真(then),或者返回第三个参数,其中计算结果为假(else)。这会将
true/false
逻辑转换为1和0个数值,分别输入。因此,例如,当您想要聚合“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
}

您还应该指定所有文档
机制
值,其中
机制KG
机制
只能有两个值(
机制1
机制2
),如您的示例所示,或者可能的机制数量不受您的应用程序限制,可能是
机制3
机制4
。。。因此,根据特定的集合,结果文档的长度将不同state@tarashypka谢谢你的提醒。检查我的编辑。我获取了
0条记录
。我认为第一次分组应该在
iecode
上完成。您是否在正确的集合上运行聚合操作?如您所见,第一个分组实际上是通过
iecode
字段进行分组。很抱歉(分组)。是的,我正在查询正确的集合,但结果仍然相同。我在您提供的集合上进行了检查,得到了预期的结果,聚合查询是正确的。它应该与您的收藏有关,或者您错误地从答案中复制了查询。再次检查查询,确保您的收藏与您的问题中的完全相同。@请为您的新问题创建另一个答案,我相信有人会帮助您。评论不是为了长答案,只是为了简短的澄清。也试着在那里展示你解决问题的尝试。