MongoDB聚合:修改子子数组中具有特定值的元素

MongoDB aggregation: modify elements with a specific value in sub-sub-array

我有一个 MongoDB 数据库具有这种文档结构:

{
  "CustomerID": 2019,  
  "Segment": "SME",  
  "Currency": "EUR",  
  "Transactions": [    
    {      "Date": 201302,      "Consumption": 26.34 },    
    {      "Date": 201303,      "Consumption": 3.3 },    
    {      "Date": 201304,      "Consumption": 3572.21 },    
 ]}

我正在尝试寻找一种方法来使用聚合管道计算特定时间间隔内客户的总消费量。我的想法是将不符合我条件的元素的“消耗”字段设置为0,然后将所有不同的消耗加在一起(即我想找到“201302”和“201303”之间的总消耗,如果date is not between [201302, 201303],将消耗设置为0,然后将所有不同的消耗相加)。

问题是我在访问子数组中的这些元素时遇到了很多麻烦,我真的不知道如何解决这个问题,我对 Mongo

在此先感谢您!

查询

  • 从0开始减少
  • 如果日期在该范围内,则添加到 $$value
  • 否则保留旧的 $$value
  • 如果您也想为所有用户提供此功能,就像所有客户的总数一样,您还可以再添加一个阶段
{"$group": 
  {"_id": null, 
   "globalTotalConsumption": {"$sum": "$totalConsumption"}}}

Playmongo

aggregate(
[{"$set": 
   {"totalConsumption": 
     {"$reduce": 
       {"input": "$Transactions",
        "initialValue": 0,
        "in": 
         {"$cond": 
           [{"$and": 
               [{"$gte": ["$$this.Date", 201302]},
                 {"$lte": ["$$this.Date", 201303]}]},
             {"$add": ["$$value", "$$this.Consumption"]}, "$$value"]}}}}}])