2014-03-03 173 views
2

我有一個MongoDB查詢,我想弄清楚。我想按日期和其他字段(投資組合)對數據進行分組,並獲取該分組中每個buildResult的計數。基於值的MongoDB聚合計數

的樣本數據是這樣的:

{ 
      "_id" : ObjectId("52dea764e4b0a491abb54102"), 
      "type" : "build", 
      "time" : ISODate("2014-01-21T16:59:16.642Z"), 
      "data" : { 
        "buildNumber" : 35, 
        "buildDuration" : 1034300, 
        "portfolio" : "Shared", 
        "buildResult" : "FAILURE" 
      } 
    } 
    { 
      "_id" : ObjectId("52dea7b7e4b0a491abb54103"), 
      "type" : "build", 
      "time" : ISODate("2014-01-21T17:00:39.617Z"), 
      "data" : { 
        "buildNumber" : 13, 
        "buildDuration" : 1186028, 
        "portfolio" : "Sample", 
        "buildResult" : "SUCCESS" 
      } 
    } 

我拍攝的輸出會是這樣的:

{ 
      "result" : [ 
        { 
          "_id" : { 
            "month" : 2, 
            "day" : 28, 
            "year" : 2014, 
            "portfolio" : "Shared" 
          }, 
          "aborted" : 3, 
          "failure" : 0, 
          "unstable" : 0, 
          "success" : 34 
        }, 
        { 
          "_id" : { 
            "month" : 2, 
            "day" : 28, 
            "year" : 2014, 
            "portfolio" : "Sample" 
          }, 
          "aborted" : 3, 
          "failure" : 2, 
          "unstable" : 0, 
          "success" : 37 
        } 
      ], 
      "ok" : 1 
    } 

我當前的查詢是:

db.builds.aggregate([  
    { $match: { "data.buildResult" : { $ne : null} }}, 
    { $group: {   
     _id: {    
      month: { $month: "$time" },    
      day: { $dayOfMonth: "$time" },    
      year: { $year: "$time" }, 
      portfolio: "$data.portfolio",      
     },   
     aborted: { $sum: { "$data.buildResult": "ABORTED" } }, 
     failure: { $sum: { "$data.buildResult": "FAILURE" } }, 
     unstable: { $sum: { "$data.buildResult": "UNSTABLE" } }, 
     success: { $sum: { "$data.buildResult": "SUCCESS" } } 
    } },  
    { $sort: { "_id.day": 1, "_id.month": 1, "_id.year": 1 } } 
]) 

我有嘗試了許多變體,其中包括$ match,$ in和其他運算符。任何幫助將非常感激。

aborted: { $sum: { "$data.buildResult": "ABORTED" } }, 
failure: { $sum: { "$data.buildResult": "FAILURE" } }, 
unstable: { $sum: { "$data.buildResult": "UNSTABLE" } }, 
success: { $sum: { "$data.buildResult": "SUCCESS" } } 

回答

2

爲了實現這一目標,你可以使用$cond$eq運營商這樣的:

aborted: {$sum: {$cond : [{$eq : ["$data.buildResult", "ABORTED"]}, 1, 0]}} 

編輯: 正如在評論Neil Lunn注意到,這裏的$ cond是無關緊要的,因爲$ eq運營商已經返回0或1.

aborted: {$sum: {$eq : ["$data.buildResult", "ABORTED"]}} 
+0

非常好 - 謝謝。 – JamesE

+1

@JimG也可以將你的排序翻轉:) {$ sort:{「_id.year」:1,「_id.month」:1,「_id.day」:1}} – joao

+1

@joao其實'$ eq'本身將返回1或0,從而使'$ cond'不相關。只是爲了將來的通知。 –