基于某些条件的MongoDB聚合分支计算?

时间:2018-07-10 14:42:23

标签: mongodb aggregation-framework conditional-statements calculation

我有一个值范围:

[{
    "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”值相加。另外一次,我想传递一个Date范围,然后仅基于该日期范围计算值的总和。我怎样才能做到这一点? 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"        
                    }
                }
            }

1 个答案:

答案 0 :(得分:0)

您可以使用$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'}} }
    ]
  }
]