MongoDB返回flatten结果

时间:2016-01-08 01:04:45

标签: javascript node.js mongodb

我的MongoDB中有一些嵌套集合。

当我在服务器上运行以下查询时:

AggregatedData
.aggregateAsync([{
  $match: {
    "_id.date": {
      $gte: dateFrom,
      $lte: dateTo
    }
  }
}, {
  $project: {
    "date": "$_id.date",
    "type": "$_id.type",
    "count": "$count.total",
    "_id": 0
  }
}]);

我最终得到了这个结果:

[
{
  "date": "2016-01-08T00:00:00.000Z",
  "type": "V1",
  "count": 7359
},
{
  "date": "2016-01-08T00:00:00.000Z",
  "type": "V2",
  "count": 2874
},
{
  "date": "2016-01-08T00:00:00.000Z",
  "type": "V3",
  "count": 512
},
{
  "date": "2016-01-07T00:00:00.000Z",
  "type": "V1",
  "count": 6892
},
{
  "date": "2016-01-07T00:00:00.000Z",
  "type": "V2",
  "count": 3124
},
{
  "date": "2016-01-07T00:00:00.000Z",
  "type": "V3",
  "count": 457
}
]

现在,这就是我想要的:

[
{
  "date": "Thu Jan 07 2016 00:00:0 GMT-0800 (PST)",
  "types": ["V1", "V2", "V3"],
  "values": [7359, 2874, 512]
},
{
  "date": "Thu Jan 08 2016 00:00:0 GMT-0800 (PST)",
  "types": ["V1", "V2", "V3"],
  "values": [6892, 3124, 457]
}
]

我可以通过将服务器端功能更改为:

来实现
AggregatedData
.aggregateAsync([{
  $match: {
    "_id.date": {
      $gte: dateFrom,
      $lte: dateTo
    }
  }
}, {
  $project: {
    "date": "$_id.date",
    "type": "$_id.type",
    "count": "$count.total",
    "_id": 0
  }
}])
.then((results) => {
  return _.chain(results)
    .groupBy('date')
    .map(function(value, key) {
      return {
        date: key,
        types: _.pluck(value, 'type'),
        values: _.pluck(value, 'count')
      }
    })
    .value();
});

有没有办法使用MongoDB聚合框架实现相同的功能,不在服务器端进行处理,让它在db端完成?

1 个答案:

答案 0 :(得分:1)

对于您使用过的管道,最后再由另一个管道操作员扩展,如下所示。


$group: {
    _id: '$date',
    types: {$push: '$type'},
    counts: {$push: '$count'}

}

参考here