在 MongoDB 中组合组 - 聚合

Posted

技术标签:

【中文标题】在 MongoDB 中组合组 - 聚合【英文标题】:Combining groups in MongoDB - Aggregation 【发布时间】:2021-11-20 20:44:05 【问题描述】:

我在mysql中有这段代码,对应一个简单的汽车数据库

SELECT
"Cost" AS "Metric",
AVG(car_cost) As "Avg",
MIN(car_cost) As "Min",
MAX(car_cost) As "Max",
"Dollars" As "Unit"
from db.car_data

union SELECT
'Mileage',
AVG(car_mileage),
MIN(car_mileage),
MAX(car_mileage),
'Miles'
from db.car_data

返回这个表

Metric Avg Min Max
Cost 2345 5674 53456
Mileage 49023 53 178003

但是,当在 MongoDB 等效项中重新创建它时,我遇到了一个问题

 db.car_data.aggregate([
  "$group": 
    
      _id: null,
      Avg: 
        $avg:  "$car_cost" 
      ,
      Min: 
        $min:  "$car_cost" 
      ,
      Max: 
        $max:  "$car_cost" 
      
    
  ,
  "$group": 
    
      _id: null,
      Avg: 
        $avg:  car_mileage 
      ,
      Min: 
        $min:  car_mileage 
      ,
      Max: 
        $max:  car_mileage 
      
    
  
]);

实际输出

[
  
    "_id": null,
    "Avg": null,
    "Min": null,
    "Max": null
  
]

预期输出

[
  
    "_id": null,
    "Avg": 2345,
    "Min": 5674,
    "Max": 53456
  ,
  
    "_id": null,
    "Avg": 49023,
    "Min": 53,
    "Max": 178003
  
]

我做错了什么还是有更好的方法来通过 Mongo 中的聚合来做到这一点?他们各自在 Mongo 中独立工作...

【问题讨论】:

检查这个:docs.mongodb.com/manual/reference/operator/aggregation/… 它们是 2 个同名的集合,但来自不同的数据库?在一个您使用 db 中,在另一个 dbName 中,如果它的 1 个集合来自同一个数据库,您可以使用 6 个累加器而不是 3 个,并通过项目更改结果。我们有$facet$unionWith,但似乎不需要任何这些。如果您真的需要 2 个文档,您可以将它们放入 1 个数组(6 个结果)中,其中包含 2 个成员并展开 @Takis_ 感谢您指出这个错字。他们应该是同一个数据库。我已经编辑了我的问题 【参考方案1】:

查询

您在 1 个数据库中有 1 个集合,并且需要 6 个累加器 您可以将它们分成 3 个一组甚至 2 个文档,以获得准确的 SQL 类结果

*我们有 $facet $unionWith 等,但您不需要这些,无需进行多次聚合,只需 1 即可获得所需的一切。

Test code here

aggregate(
[ 
  "$group" : 
    "_id" : null,
    "avg_cost" : 
      "$avg" : "$car_cost"
    ,
    "min_cost" : 
      "$min" : "$car_cost"
    ,
    "max_cost" : 
      "$max" : "$car_cost"
    ,
    "avg_mileage" : 
      "$avg" : "$car_mileage"
    ,
    "min_mileage" : 
      "$min" : "$car_mileage"
    ,
    "max_mileage" : 
      "$max" : "$car_mileage"
    
  
, 
  "$set" : 
    "array" : [ 
      "metric" : "cost",
      "avg" : "$avg_cost",
      "min" : "$min_cost",
      "max" : "$max_cost"
    , 
      "metric" : "mileage",
      "avg" : "$avg_mileage",
      "min" : "$min_mileage",
      "max" : "$max_mileage"
     ]
  
, 
  "$unwind" : 
    "path" : "$array"
  
, 
  "$replaceRoot" : 
    "newRoot" : "$array"
  
 ]
)

【讨论】:

对我想要达到的目标的完美解释。感谢您的帮助!

以上是关于在 MongoDB 中组合组 - 聚合的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB聚合(aggregate)常用操作及示例

mongo和mongod的区别

[MongoDB]Profiling性能分析

如何拦截和记录 mongodb 查询? [复制]

mongodb远程认证失败Mongod v4

Mongodb启动命令mongod参数说明