我有一个包含发票号码的文档和一个我指定发票类型的子文档
{
"inum" : "001",
"date" : "28-May-2017",
"value" : 10020,
"section" : {
"B2C" : false,
"B2B" : true
}
},
{
"inum" : "001",
"date" : "22-May-2017",
"value" : 3400,
"section" : {
"B2C" : false,
"B2B" : true
}
},
{
"inum" : "034",
"date" : "22-May-2017",
"value" : 80500,
"section" : {
"B2C" : true,
"B2B" : false
}
}
现在我根据发票号码对文档进行分组,并使用 Mongoose 查询对其进行分组并获得预期结果。
所以它会给我一张发票,其值
总和如下
{
"inum" : "001",
"value" : 13420,
"section" : {
"B2C" : false,
"B2B" : true
}
},
{
"inum" : "034",
"date" : "22-May-2017",
"value" : 80500,
"section" : {
"B2C" : true,
"B2B" : false
}
}
现在我想要统计分组后不同部分类型的发票总数,如上面的发票号。有 B2B 和 B2C
部分,所以它应该给我
{"b2b":1,"b2c":1}
上面我可以通过为所有部分创建函数来完成,但我不想为个人创建函数,我希望 mongodb 查询获取所有部分的计数。
我做了如下
{
$group: {
_id : {inum:"$inum"},
b2b: {$sum: {$cond: [{$eq:["$section.B2B", true]}, 1, 0]}},
b2c: {$sum: {$cond: [{$eq:["$section.B2C", true]}, 1, 0]}},
}
},
{$project: {_id:0}},
它给了我未合并的发票号码的计数
{ "b2b":2, "b2c":1 }
但是我想在分组数据后进行计数
{ "b2b":1, "b2c":1}
最佳答案
你想要“两个”$group
阶段在这里。一个使用 $first
对于“部分”,当对“inum”进行分组时,对 null
进行另一个分组,实际 $sum
:
[
{ "$group": {
"_id": "$inum",
"section": { "$first": "$section" }
}},
{ "$group": {
"_id": null,
"b2b": { "$sum": { "$cond": [ "$section.B2B", 1, 0 ] } },
"b2c": { "$sum": { "$cond": [ "$section.B2C", 1, 0 ] } }
}}
]
第一个只是根据您的要求“合并”,并仅保留 $first
找到“section”
数据。
后面的条件对所有文档进行累积,因为这就是null
作为分组键评估的结果。
$cond
这里的语法可以缩短,因为被检查的三元表达式的第一个“if”条件实际上已经是一个“ bool ”true/false
值。因此不需要额外的比较来强制 bool 值。
关于mongodb - 分组数据的聚合计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44491829/