Агрегация MongoDB: Группировать по категориям и суммировать сумму - PullRequest
2 голосов
/ 07 марта 2020

В моей коллекции есть следующая структура (вам не нужно обращать внимание на статус):

    {
"_id":{"$oid":"5e6355e71b14ee00175698cb"},
"finance":{
                "expenditure":[
                             {"status":true,"_id":{"$oid":"5e63562d1b14ee00175698df"},"amount"{"$numberInt":"100"},"category":"Sport"}, 
                             {"status":true,"_id":{"$oid":"5e6356491b14ee00175698e0"},"amount":{"$numberInt":"200"},"category":"Sport"},
                             {"status":true,"_id":{"$oid":"5e63565b1b14ee00175698e1"},"amount":{"$numberInt":"50"},"category":"Outdoor"},
                             {"status":true,"_id":{"$oid":"5e63566d1b14ee00175698e2"},"amount":{"$numberInt":"400"},"category":"Outdoor"}
]
}
}

Моя предыдущая ios команда была такой:

User.aggregate([
            { $match: {_id: req.user._id}},
            { $unwind: '$finance.expenditure'},
            { $match: {'finance.expenditure.status': true}},
            { $sort: {'finance.expenditure.currentdate': -1}},
            { $group: {_id: '$_id', expenditure: {$push: '$finance.expenditure'}}}])

При этом я просто получаю обратно все расходы.

Но теперь я хочу сгруппировать расходы по их категориям и суммировать суммы всех расходов по их группе.

Так должно выглядеть так:

{"amount": 300 },"category":"Sport"}, 

{"amount": 450 },"category":"Outdoor"}

Спасибо за помощь

1 Ответ

1 голос
/ 07 марта 2020

Вместо группировки по _id группа полей по полю категории и сумме суммы:

db.collection.aggregate([
  { $match: {_id: req.user._id}},
  {
    $unwind: "$finance.expenditure"
  },
  {
    $match: {
      "finance.expenditure.status": true
    }
  },
  {
    $sort: {
      "finance.expenditure.currentdate": -1
    }
  },
  {
    $group: {
      _id: "$finance.expenditure.category",
      amount: {
        $sum: "$finance.expenditure.amount"
      }
    }
  },
  {
    $project: {
      _id: 0,
      category: "$_id",
      amount: 1
    }
  }
])

Тест: MongoDB-Playground

...