MongoDB 返回展平结果

Posted

技术标签:

【中文标题】MongoDB 返回展平结果【英文标题】:MongoDB return flatten result 【发布时间】:2016-04-12 14:21:11 【问题描述】:

我的 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 端完成?

【问题讨论】:

看起来您需要在项目步骤之后使用$group 运算符 我不太了解 mongodb,但似乎有 $group 和 $map 聚合运算符:docs.mongodb.org/manual/reference/operator/aggregation/mapdocs.mongodb.org/manual/reference/operator/aggregation/group 【参考方案1】:

对于您使用的管道,请在末尾再扩展一个管道运算符,如下所示。


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

参考here

【讨论】:

谢谢!这就是我需要的

以上是关于MongoDB 返回展平结果的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB聚合:将数组属性展平为根数组

如何在 MongoDB 中将子文档展平为根级别?

在MongoDB mapreduce中,如何展平值对象?

如何展平来自聚合输出的 JSON 结果

我如何确定 mongodb 是不是返回空结果

Mongodb - 没有结果返回时性能不佳