这是我的数据库。
{
"_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/