MongoDB Group и объединение с несколькими документами в одном документе - PullRequest
0 голосов
/ 06 июля 2018

Я хочу объединить из коллекции 2 поля:

var StatusSchema = mongoose.Schema({
    Demonstrator: SchemaTypes.Long, 
    DemoBetriebsbereit: Boolean
}

Моя функция агрегирования должна агрегироваться по демонстранту, а также по полю DemoBetriebsbereit, а затем подсчитывать случаи для каждой комбинации. Функция агрегирования выглядит следующим образом:

    exports.getStatusDemonstrators = function(req,res) {
        Status.aggregate([
            {
                $match: {
                    "DemoBetriebsbereit": {$exists:1}
                }
            },
            {
                $group: {
                    _id: {Demonstrator: "$Demonstrator", betriebsbereit: 
                          "$DemoBetriebsbereit"}, Anzahl: {$sum:1}
                }
            }
        ]).exec(function(error, status) {
            if (error) {
                res.send(error);
            }
            else {
                res.json(status);
            }
        });
    }

Вывод такой:

[{"_id":{"Demonstrator":9,"betriebsbereit":false},"Anzahl":1},{"_id":{"Demonstrator":2,"betriebsbereit":false},"Anzahl":1},{"_id":{"Demonstrator":3,"betriebsbereit":false},"Anzahl":1},{"_id":{"Demonstrator":10,"betriebsbereit":false},"Anzahl":1},{"_id":{"Demonstrator":2,"betriebsbereit":true},"Anzahl":9},{"_id":{"Demonstrator":8,"betriebsbereit":false},"Anzahl":1},{"_id":{"Demonstrator":9,"betriebsbereit":true},"Anzahl":8},{"_id":{"Demonstrator":1,"betriebsbereit":true},"Anzahl":5},{"_id":{"Demonstrator":6,"betriebsbereit":true},"Anzahl":7},{"_id":{"Demonstrator":10,"betriebsbereit":true},"Anzahl":8},{"_id":{"Demonstrator":7,"betriebsbereit":false},"Anzahl":1},{"_id":{"Demonstrator":3,"betriebsbereit":true},"Anzahl":10}]

Однако я бы хотел, чтобы результат был таким:

{Demonstrator:10, series: [{betriebsbereit: true, Anzahl: 8}, {betriebsbereit: false, Anzahl:1}]},{Demonstrator:9, series: [...]},...

в таком формате, чтобы я мог поместить его прямо в диаграмму ngx.

1 Ответ

0 голосов
/ 06 июля 2018

Вам нужно добавить еще один $group шаг, а затем $project.

Это конвейер агрегации:

[
  {$match: {"DemoBetriebsbereit": {$exists: 1}}},
  { $group: {
    _id: {Demonstrator: "$Demonstrator", betriebsbereit: "$DemoBetriebsbereit"},
    Anzahl: {$sum: 1}
  }},
  { $group: {
     _id: "$_id.Demonstrator",
     series: {$push: {betriebsbereit: "$_id.betriebsbereit", Anzahl: "$Anzahl"}}
  }},
  {$project: {_id: 0, Demonstrator: "$_id", series: "$series"}}
]
...