获取mongodb中最大计数的字段名称

Posted

技术标签:

【中文标题】获取mongodb中最大计数的字段名称【英文标题】:Getting the name of the field with maximum count in mongodb 【发布时间】:2017-04-19 21:13:18 【问题描述】:

我是 mongodb 的新手,想获取数量最多的字段(备件类型)的名称!我的收藏中的一个示例文档(原始收藏有 50 个文档)如下所示

[
  
    "Vehicle": 
      "licensePlateNo": "111A",
      "vehicletype": "Car",
      "model": "Nissan Sunny",
      "VehicleCategory": [
        
          "name": "Passenger"
        
      ],
      "SparePart": [
        
          "sparePartID": 4,
          "Type": "Wheel",
          "Price": 10000,
          "Supplier": [
            
              "supplierNo": 10,
              "name": "Saman",
              "contactNo": 112412634
            
          ]
        
      ],
      "Employee": [
        
          "employeeNo": 3,
          "job": "Painter",
          "jobCategory": "",
          "salary": 100000
        
      ]
    
  
]

如何编写查询以获取数量最多的备件名称?

【问题讨论】:

计数在哪里? 没有计数我想执行一个查询,比如从 max(count) 的车辆中选择备件类型 还是不知道你在问什么。 db.AutoSmart.count("Vehicle__SparePart__Type":"Wheel") 当我运行这个时,我得到了车轮的出现次数!我想检索出现次数最多的备件类型 【参考方案1】:

对此类查询使用聚合框架。特别是,您需要运行一个聚合操作,其中管道由以下阶段组成(按顺序):

$unwind - 您需要将其作为第一个管道步骤,以便展平 SparePart 数组,以便您可以在管道中进一步处理非规范化的文档。没有这个你不会得到 所需的结果,因为数据将采用数组格式,并且前一阶段中的累加器运算符处理单个文档以聚合计数。

$group - 此步骤将为您计算按类型字段分组的文档的计数。累加器运算符 $sum 将返回每个组的文档总数。

$sort - 当您从之前的 $group 管道中获得结果时,您需要按计数字段对文档进行排序,以便获得计数最多的文档。

$limit - 这将为您提供最上面的文档。

现在,将以上内容组合在一起,您应该运行以下管道以获得所需的结果:

db.AutoSmart.aggregate([
     "$unwind": "$Vehicle.SparePart" ,
    
        "$group": 
            "_id": "$Vehicle.SparePart.Type",
            "count":  "$sum": 1 
        
    ,
     "$sort":  "count": -1  ,
     "$limit": 1  
])

【讨论】:

如果我想得到最小的,我该如何改变它? 要获得最小值,只需将$sort 管道更改为 "$sort": "count": 1 【参考方案2】:

假设我们想从 DB 中获取用户的最大年龄。

db.collection.find().sort(age:-1).limit(1) // for MAX  

您可以进一步检查document。

【讨论】:

以上是关于获取mongodb中最大计数的字段名称的主要内容,如果未能解决你的问题,请参考以下文章

如何在 mongoDB 的集合数组中获取字段名称?

如何获取MongoDB中字段的最大值

mongodb如何获取表结构,以及表字段的名称?

SQL查询根据值和字段名从两个表中获取计数

如何在 mongodb-native findOne() 中使用变量作为字段名?

李老师 mongoDB中 字符类型的字段 有大小长度限制吗