对分组数据的聚合计数

时间:2017-06-12 05:15:29

标签: 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查询分组并获得预期结果。 所以它会给我一张总额为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}

1 个答案:

答案 0 :(得分:1)

你想要"两个"这里有$group个阶段。一个使用$first用于"部分"在" inum"上进行分组时以及实际$sum上的null上的另一个分组:

[
 { "$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"被检查的三元表达式的条件实际上已经是" boolean" true/false值。console.log(Object.keys(data))所以不需要额外的比较来强制转换为布尔值。