gpt4 book ai didi

mongodb - 分组数据的聚合计数

转载 作者:可可西里 更新时间:2023-11-01 10:15:23 26 4
gpt4 key购买 nike

我有包含发票编号的文档和指定发票类型的子文档

{  
"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 查询对其进行分组并获得预期结果。所以它会给我一张总和为 value 的发票,如下所示

{  
"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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com