繁体   English   中英

MongoDB:使用嵌套值按年/月获取总和

[英]MongoDB: get sum by year/month with nested values

我正在尝试对嵌套金额的集合求和(按月/年支出) - 没有运气。

这是集合(摘录):

[
{
    "_id" : ObjectId("5faaf88d0657287993e541a5"),
    "segment" : {
        "l1" : "Segment A",
        "l2" : "001"
    },
    "invoiceNo" : "2020.10283940",
    "invoicePos" : 3,
    "date" : ISODate("2019-09-06T00:00:00.000Z"),
    "amount" : {
        "document" : {
            "amount" : NumberDecimal("125.000000000000"),
            "currCode" : "USD"
        },
        "local" : {
            "amount" : NumberDecimal("123.800000000000"),
            "currCode" : "CHF"
        },
        "global" : {
            "amount" : NumberDecimal("123.800000000000"),
            "currCode" : "CHF"
        }
    }
},
...
]

我想以“全球”货币总结每月的汇总发票量。

我在 MongoDB 上尝试了这个查询:

db.invoices.aggregate( 
       {$project : { 
              month : {$month : "$date"}, 
              year : {$year :  "$date"},
              amount : 1
          }},
        {$unwind: '$amount'}, 
        {$group : { 
                _id : {month : "$month" ,year : "$year" },  
              total : {$sum : "$amount.global.amount"} 
        }})

我得到的结果是:

/* 1 */
{
    "_id" : ObjectId("5faaf88d0657287993e541a5"),
    "amount" : {
        "document" : {
            "amount" : NumberDecimal("125.000000000000"),
            "currCode" : "USD"
        },
        "local" : {
            "amount" : NumberDecimal("123.800000000000"),
            "currCode" : "CHF"
        },
        "global" : {
            "amount" : NumberDecimal("123.800000000000"),
            "currCode" : "CHF"
        }
    },
    "month" : 9,
    "year" : 2019
}

/* 2 */
{
    "_id" : ObjectId("5faaf88d0657287993e541ac"),
    "amount" : {
        "document" : {
            "amount" : NumberDecimal("105.560000000000"),
            "currCode" : "CHF"
        },
        "local" : {
            "amount" : NumberDecimal("105.560000000000"),
            "currCode" : "CHF"
        },
        "global" : {
            "amount" : NumberDecimal("105.560000000000"),
            "currCode" : "CHF"
        }
    },
    "month" : 11,
    "year" : 2020
}

然而,这不会汇总每个月的所有发票,而是看起来像单个发票行 - 没有聚合。

我想得到这样的结果:

[
  {
    "month": 11,
    "year": 2020,
    "amount" : NumberDecimal("99999.99") 
  },
  {
    "month": 10,
    "year": 2020,
    "amount" : NumberDecimal("99999.99") 
  },
  {
    "month": 9,
    "year": 2020,
    "amount" : NumberDecimal("99999.99") 
  }
]

我的查询有什么问题?

这会有帮助吗?

db.invoices.aggregate([
  {
    $group: {
      _id: {
        month: {
          $month: "$date"
        },
        year: {
          $year: "$date"
        }
      },
      total: {
        $sum: "$amount.global.amount"
      }
    }
  },
  {$sort:{"_id.year":-1, "_id.month":-1}}
])

操场

如果您需要任何额外的解释,请告诉我,但代码非常简短且不言自明。

原则上您的聚合管道很好,有一些错误:

  • 聚合管道需要一个数组
  • $unwind没用,因为$amount不是数组。 一个元素输入 -> 一个文档输出
  • 您可以直接使用日期功能

所以,简短而简单:

db.invoices.aggregate([
  {
    $group: {
      _id: { month: { $month: "$date" }, year: { $year: "$date" } },
      total: { $sum: "$amount.global.amount" }
    }
  }
])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM