MongoDB组并在一个文档中聚合多个文档

时间:2018-07-06 10:38:39

标签: mongodb group-by aggregation

我想从具有2个字段的集合中进行汇总:

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

我的聚合函数应该通过Demonstrator以及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 :(得分:2)

您需要添加另一个$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"}}
]