首页 文章

对分组数据的聚合计数

提问于
浏览
2

我有文件,其中我有发票号码和一个子文件,我在其中指定了发票的类型

{  
    "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 回答

  • 1

    你想要"two" $group阶段 . 一个人使用$first作为"section",在"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 ] } }
     }}
    ]
    

    第一个是作为您的请求转到"merge",只保留$first "section" 数据 .

    后面的条件会对 all 文档进行累积,因为这是作为分组键评估的 null .

    这里的$cond语法可以缩短,因为正在检查的三元表达式的第一个"if"条件实际上已经是"boolean" true/false 值 . 所以不需要额外的比较来强制转换为布尔值 .

相关问题