在MongoDB中获取具有最大计数的字段名称

3

我是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
        }
      ]
    }
  }
]

我该如何编写查询语句以获取备件名称的最高计数?


计数器在哪里? - Murat Karagöz
我想执行一个查询,类似于从车辆中选择备件类型,其中没有计数。 - Suneth Perera
仍然不知道你在问什么。 - Murat Karagöz
db.AutoSmart.count({"Vehicle__SparePart__Type":"Wheel"}) 运行此命令可获取轮子出现的次数!我想检索出现次数最多的备件类型。 - Suneth Perera
2个回答

2
使用聚合框架进行此类型的查询。特别是需要运行一个聚合操作,其中管道由以下阶段组成(按顺序): $unwind - 您需要将其作为第一个管道步骤,以便展开SparePart数组,以便您可以在管道下游进一步处理文档。如果没有这个步骤,您将无法获得所需的结果,因为数据将以数组格式存在,并且前面阶段中的累加器运算符将单个文档用于聚合计数。 $group - 此步骤将为您计算按Type字段分组的文档的计数。累加器运算符$sum将返回每个组中文档的总数。

$sort - 从前一个$group管道获取结果后,您需要按计数字段对文档进行排序,以便获取计数最多的顶级文档。

$limit - 这将为您提供顶级文档。

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

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

如果我想要得到最小的一个,我应该如何改变它? - Suneth Perera
要获取最小值,只需将$sort管道更改为{ "$sort": { "count": 1 } } - chridam

0

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

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

你可以进一步查看文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接