【问题标题】:MongoDB Aggregate SumMongoDB 总和
【发布时间】:2019-08-08 04:20:14
【问题描述】:
{
    "_id":1
    "Data1": "R"
    "Data2": "A"
    "Data3": [{"TP":"1", "Vl":200},{"TP":"2", "Vl":100}, {"TP":"1", "Vl": 50} ]
}
{
    "_id":2
    "Data1": "G"
    "Data2": "A"
    "Data3": [{"TP":"1", "Vl":400}]
}
{
    "_id":3
    "Data1": "R"
    "Data2": "K"
    "Data3": [{"TP":"2", "Vl":500}, {"TP":"3", "Vl":20}]
}

我需要将 Data3 中的所有 Vl 按 data1 分组,返回如下:

[{"Data1":"R", "sum":870}, {"Data1":"G", sum:400}]

有些像 Sql:

Select Data1, sum(Data3.Vl) 
from Collection
Group By
Data1

我试试这个,但总和为 0。

db.getCollection("Collection").aggregate(
    [
        { 
            "$group" : {
                "_id" : {
                    "Data1" : "$Data1"
                }, 
                "SUM(Data3᎐Vl)" : {
                    "$sum" : "$Data3.Vl"
                }
            }
        }, 
        { 
            "$project" : {
                "Data1" : "$_id.Data1", 
                "SUM(Data3᎐Vl)" : "$SUM(Data3᎐Vl)", 
                "_id" : NumberInt(0)
            }
        }
    ], 
    { 
        "allowDiskUse" : true
    }
);

【问题讨论】:

    标签: mongodb aggregate


    【解决方案1】:

    试试这个:

    db.getCollection("Collection").aggregate([{$unwind: '$Data3'}, {$group : {_id : '$Data1', sum: { $sum : '$Data3.Vl'}}}])
    

    您会在下面说,在聚合查询中,如果管道步骤超过 100MB 的内存,则需要使用一些临时磁盘空间。尝试在对整个集合执行 $unwind 之前尽早使用 $match 过滤文档。

    { 
            "allowDiskUse" : true
    }
    

    【讨论】:

      【解决方案2】:

      我们可以使用$sum 来计算 Data3 数组中存在的“Vl”的总和。以下查询可以获得预期的输出:

      db.Collection.aggregate([
          {
              $group:{
                  "_id":"$Data1",
                  "Data1":{
                      $first:"$Data1"
                  },
                  "sum":{
                      $sum:{
                          $sum:"$Data3.Vl"
                      }
                  }
              }
          },
          {
              $project:{
                  "_id":0
              }
          }
      ]).pretty()
      

      输出:

      { "Data1" : "G", "sum" : 400 }
      { "Data1" : "R", "sum" : 870 }
      

      最里面的 $sum 是对 'Data3.Vl' 求和,而外面的 $sum 是对计算的总和求和 :)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-02
        相关资源
        最近更新 更多