итого по всем группам, используя mongodb - PullRequest
0 голосов
/ 22 октября 2018

Я сделал этот Агрегированный конвейер, и я хочу добавить поле, содержащее Глобальный Total всех groups total.

    { "$match": query },
    { "$sort": cursor.sort },
    { "$group": { 
      _id: { key:"$paymentFromId"},
      items: {
        $push: {
         _id:"$_id",
         value:"$value",
         transaction:"$transaction",
         paymentMethod:"$paymentMethod",
         createdAt:"$createdAt",
         ...
        }
      },
      count:{$sum:1},
      total:{$sum:"$value"}
    }}
    {
      //i want to get
      ...project groups , goupsTotal , groupsCount
    }
    ,{
      "$skip":cursor.skip
    },{
      "$limit":cursor.limit
    },
])

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Я сделал это таким образом, проецируя результат $group в новое поле doc и $sum промежуточные итоги.

 {
  $project: {
      "doc": {
          "_id": "$_id",
          "total": "$total",
          "items":"$items",
          "count":"$count"
      }
  }
},{
  $group: {
      "_id": null,
      "globalTotal": {
          $sum: "$doc.total"
      },
      "result": {
          $push: "$doc"
      }
  }
},
{
  $project: {
      "result": 1,
      //paging "result": {$slice: [ "$result", cursor.skip,cursor.limit ] },
      "_id": 0,
      "globalTotal": 1
  }
}

выход

[
 { 
  globalTotal: 121500,
  result: [ [group1], [group2], [group3], ... ]
 }
]
0 голосов
/ 22 октября 2018

вам нужно использовать $ facet (доступно из MongoDB 3.4) для применения нескольких конвейеров к одному и тому же набору документов

первый конвейер : пропустить и ограничить документы

второй конвейер : вычислить общее количество всех групп

  { "$match": query },
  { "$sort": cursor.sort },
  { "$group": { 
  _id: { key:"$paymentFromId"},
  items: {
    $push: "$$CURRENT"
  },
  count:{$sum:1},
  total:{$sum:"$value"}
    }
 },
 {
   $facet: {
      docs: [
        { $skip:cursor.skip },
        { $limit:cursor.limit }
     ],
      overall: [
       {$group: {
             _id: null, 
             groupsTotal: {$sum: '$total'}, 
             groupsCount:{ $sum: '$count'}
         }
      }
   ]
 }

окончательный результат будет

 {
    docs: [  .... ], // array of {_id, items, count, total}
    overall: {   } // object with properties groupsTotal, groupsCount
 }

PS: Я заменил элементы на третьем этапе конвейера на $$CURRENT, что для простоты добавляет весь документ, если вам нужны пользовательские свойства, укажите их.

...