mongodb - 分组数据的聚合计数

标签 mongodb count aggregation-framework

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

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

相关文章:

python - MongoDB/PyMongo/Python(时间): Getting the Datetime as String

c# - 有没有办法同步使用 MongoDB C# 驱动程序

mysql - MYSQL 中的多个 COUNT 与单个列的条件

php - PHP 和 MySQL 中唯一访问次数的有效计数器

mongodb - 如何在mongo聚合期间复制文档?

mongodb - 在mongoDB中按日期查询文档的最新版本

java - 在 Mongo 中使用游标迭代多个文档

mongodb - 来自Dockerfile RUN步骤的数据不在镜像中

MySQL COUNT() GROUP BY 子查询(?) 用于统计每月多个商品的购买情况

node.js - 比较并添加嵌套数组内的两个数组