2016-12-05 51 views
2

我是mongodb的新手,想要获取具有最大计数的字段名称(备件类型)!我收集的样本文件(原集合了50个文档)如下在mongodb中获取最大计数字段的名称

[ 
    { 
    "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 
     } 
     ] 
    } 
    } 
] 

给我如何可以编写一个查询,以获得最高计零部件的名称?

+0

伯爵在哪儿? –

+0

没有计数我想要执行一个查询,如从车辆中选择备件类型,其中最大(计数) –

+0

仍然不知道你在问什么。 –

回答

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 } 
]) 
+0

比它的工作! –

+0

如果我想获得最小的一个,我该如何改变它? –

+0

为了获得最小值,只需将'$ sort'管道更改为'{“$ sort”:{“count”:1}}''。 – chridam