2014-01-21 74 views
8

我遇到問題應用排序到聚合分組。我的原始數據如下所示:MongoDB聚合排序不起作用

{ 
      "_id" : ObjectId("52deab2fe4b0a491abb54108"), 
      "type" : "build", 
      "time" : ISODate("2014-01-21T17:15:27.471Z"), 
      "data" : { 
        "buildNumber" : 43, 
        "buildDuration" : 997308, 
        "buildProjectName" : "TestABC", 
        "buildResult" : "SUCCESS" 
      } 
    } 

我想首先通過buildProjectName對日期進行排序。這裏是我的查詢:

db.builds.aggregate([ 
    { $group: { 
     _id: { 
      month: { $month: "$time" }, 
      day: { $dayOfYear: "$time" }, 
      year: { $year: "$time" }, 
      buildProjectName: "$data.buildProjectName", 
     }, 
     buildDuration: { $avg: "$data.buildDuration" } 
    } }, 
    { $sort: {buildProjectName: 1, year: 1, month: 1, day: 1} } 
]) 

我已經嘗試切換排序順序(即:buildProjectName,日,月,年),但我總是與日期亂序得到同樣的結果:

{ 
     "result" : [ 
       { 
         "_id" : { 
           "month" : 1, 
           "day" : 20, 
           "year" : 2014, 
           "buildProjectName" : "TestABC" 
         }, 
         "buildDuration" : 1170723.5 
       }, 
       { 
         "_id" : { 
           "month" : 1, 
           "day" : 21, 
           "year" : 2014, 
           "buildProjectName" : "TestABC" 
         }, 
         "buildDuration" : 2284863.3333333335 
       }, 
       { 
         "_id" : { 
           "month" : 1, 
           "day" : 17, 
           "year" : 2014, 
           "buildProjectName" : "TestABC" 
         }, 
         "buildDuration" : 2234662 
       } 
     ], 
     "ok" : 1 
} 

回答

20

你排序上的字段是_id的一部分,所以你需要包括在你的$sort字段名稱:

db.builds.aggregate([ 
    { $group: { 
     _id: { 
      month: { $month: "$time" }, 
      day: { $dayOfYear: "$time" }, 
      year: { $year: "$time" }, 
      buildProjectName: "$data.buildProjectName", 
     }, 
     buildDuration: { $avg: "$data.buildDuration" } 
    } }, 
    { $sort: { 
     '_id.buildProjectName': 1, 
     '_id.year': 1, 
     '_id.month': 1, 
     '_id.day': 1 
    } } 
]) 
+3

他們真的應該把一些複雜的例子是這樣一個在自己做CS。 – jpgrassi