首页 > 解决方案 > 基于某些条件的MongoDB聚合分支计算?

问题描述

我有一系列值:

[{
    "Reserviert": {
        "Zeitstempel": "2018-06-06T18:19:42.317Z",
        "Wert": 46
    }
}, {
    "Reserviert": {
        "Zeitstempel": "2018-06-06T18:34:42.317Z",
        "Wert": 48
    }
}, {
    "Reserviert": {
        "Zeitstempel": "2018-07-09T14:52:32.472Z",
        "Wert": 104
    }
}, {
    "Reserviert": {
        "Zeitstempel": "2018-07-09T15:07:32.472Z",
        "Wert": 102
    }
}, {
    "Reserviert": {
        "Zeitstempel": "2018-07-09T14:52:32.472Z",
        "Wert": 20
    }
}, {
    "Reserviert": {
        "Zeitstempel": "2018-07-09T15:07:32.472Z",
        "Wert": 24
    }
}, {
    "Reserviert": {
        "Zeitstempel": "2018-07-09T14:52:32.472Z",
        "Wert": 94
    }
}, {
    "Reserviert": {
        "Zeitstempel": "2018-07-09T15:07:32.472Z",
        "Wert": 90
    }
}, {
    "Reserviert": {
        "Zeitstempel": "2018-07-09T14:52:32.473Z",
        "Wert": 33
    }
}, {
    "Reserviert": {
        "Zeitstempel": "2018-07-09T15:07:32.473Z",
        "Wert": 29
    }
}, {
    "Reserviert": {
        "Zeitstempel": "2018-07-09T14:52:32.473Z",
        "Wert": 15
    }
}]

现在,我想做一个计算:将所有存在的文档的所有“Wert”值相加。另一次,我想传递一个日期范围,然后只计算基于该日期范围的值的总和。我怎样才能做到这一点?mongoDB聚合中是否有类似“分支”的东西?因为如果我计算一件事,我就无法计算另一个分支,因为管道已经改变了我之前管道的输入......

我已经进行了基本的日期范围计算等,但不知道如何进入计算的先前“状态”,然后根据某些日期范围条件进行计算(在我计算出例如总和之后整个日期范围)

例如,我可以计算日期范围......然后总结日期范围内的所有产品......但我不能再回去计算产品的总和(也来自日期范围之外的产品)例如,如果我想计算它们之间的比率..

                $project: {
                    ProdukteImZeitraum: 
                      {
                          cond: { $and: [
                            { $gte: ["Reserviert.Zeitstempel", new Date(req.params.start) ] },
                            { $lte: ["Reserviert.Zeitstempel", new Date(req.params.end) ] }
                          ] 
                        }
                      }
                }
            }/*,
            {
                $group: {
                    _id: null,
                    res: {$addToSet: "$Reserviert.Wert"}                
                }


            },
            {
                $addFields: {
                    AlleProdukteSumme: {
                    $sum: "$res"        
                    }
                }
            }

标签: mongodbaggregation-frameworkconditional-statementscalculation

解决方案


您可以使用$facet管道阶段将管道分支为两个不同的计算 ( https://docs.mongodb.com/manual/reference/operator/aggregation/facet/ ):

[
  $facet: {
    totalSum: [
      { $group: { _id: null, totalSum: {$sum: '$Reserviert.Wert'}} }
    ],
    dateRangeSum: [
      { $match: { 'Reserviert.Zeitstempel': {
          $gte: new Date(req.params.start), 
          $lte: new Date(req.params.end)} 
      } },
      { $group: { _id: null, totalSum: {$sum: '$Reserviert.Wert'}} }
    ]
  }
]

推荐阅读