2017-06-06 47 views
1

考慮以下數據:有條件從陣列計數值到新領域

{ 
    "_id" : ObjectId("592ffb3d257acc76fc0eecd7"), 
    "primaryProcessName" : "BI", 
    "dateTimeStamp" : ISODate("2017-06-01T11:32:12.834+0000"), 
    "tag" : [ 
     { 
      "key" : "processname", 
      "value" : "NEUpdateService", 
      "value_original" : "NEUpdateService" 
     }, 
     { 
      "key" : "processstageid", 
      "value" : "inprocess", 
      "value_original" : "InProcess" 
     }, 
    ] 
}  
{ 
    "_id" : ObjectId("592ffb3d257acc76fc0eecdd"), 
    "primaryProcessName" : "BI", 
    "dateTimeStamp" : ISODate("2017-06-01T11:32:13.345+0000"), 
    "tag" : [ 
     { 
      "key" : "processname", 
      "value" : "CommissionPaymentSend", 
      "value_original" : "CommissionPaymentSend" 
     }, 
     { 
      "key" : "processstageid", 
      "value" : "faulted", 
      "value_original" : "Faulted" 
     }, 
    ] 
}  
{ 
    "_id" : ObjectId("592ffb3d257acc76fc0eece4"), 
    "primaryProcessName" : "BI", 
    "dateTimeStamp" : ISODate("2017-06-01T11:32:13.745+0000"), 
    "tag" : [ 
     { 
      "key" : "processname", 
      "value" : "commonbusinessintegratorservice", 
      "value_original" : "CommonBusinessIntegratorService" 
     }, 
     { 
      "key" : "processstageid", 
      "value" : "inprocess", 
      "value_original" : "InProcess" 
     }, 
    ] 
}  
{ 
    "_id" : ObjectId("592ffb3d257acc76fc0eecea"), 
    "primaryProcessName" : "BI", 
    "dateTimeStamp" : ISODate("2017-06-01T11:32:13.876+0000"), 
    "tag" : [ 
     { 
      "key" : "processname", 
      "value" : "commonbusinessintegratorservice", 
      "value_original" : "CommonBusinessIntegratorService" 
     }, 
     { 
      "key" : "processstageid", 
      "value" : "inprocess", 
      "value_original" : "InProcess" 
     }, 
    ] 
}  
{ 
    "_id" : ObjectId("592ffb3e257acc76fc0eecf1"), 
    "primaryProcessName" : "BI", 
    "dateTimeStamp" : ISODate("2017-06-01T11:32:14.193+0000"), 
    "tag" : [ 
     { 
      "key" : "processname", 
      "value" : "SmartComplianceMessenger", 
      "value_original" : "SmartComplianceMessenger" 
     }, 
     { 
      "key" : "processstageid", 
      "value" : "complete", 
      "value_original" : "Complete" 
     }, 
    ] 
} 

我想編寫一個查詢來彙總這些數據以下列格式顯示:

{ 
    "Total" : 1982, "InProcess" : 991, "Complete" : 991, "Faulted" : 0, 
    "name" : "SmartComplianceMessenger", 
    "displayName" : "SmartComplianceMessenger", 
    "drillDownUrl" : "process/forprimary/name/SmartComplianceMessenger" 
}, 

{ 
    "Total" : 122333, "InProcess" : 56375, "Complete" : 54856, "Faulted" : 11102, 
    "name" : "NEUpdateService", 
    "displayName" : "NEUpdateService", 
    "drillDownUrl" : "process/forprimary/name/NEUpdateService" 
}, 
.... 

這是我到目前爲止:

db.ActivityNotice.aggregate([ 
    {$match: { 
     dateTimeStamp: { 
      $gte: ISODate("2017-06-01T11:00:00.000Z") 
      , $lt: ISODate("2017-06-01T11:45:00.000Z") 
     } 
    }}, 
    {$group : 
     { 
     _id: {process: "$primaryProcessName"} //, status:"$processStageId" 
     , Total:{$sum:1} 
     , InProcess: {$sum:0}// { $sum: {$cond: [{$eq: ["$processStageId","InProcess"]},1,0]}} 
     , Complete: {$sum:0} // { $sum: {$cond: [{$eq: ["$processStageId","Complete"]},1,0]}} 
     , Faulted: {$sum:0} // { $sum: {$cond: [{$eq: ["$processStageId","Faulted"]},1,0]}} 
     , Test: { $sum: {$cond: [{$eq: ["tag.key","processstageid"]},1,0]}} 
    }}, 
    {$project: { 
     _id: 0, 
     name: "$_id.process", displayName: "$_id.process", 
     drillDownUrl: { $concat: [ "process/forprimary/name/", "$_id.process" ] }, 
     Total: 1, InProcess: 1 , Complete: 1, Faulted: 1, Test: 1 
    }} 
]) 

我面臨的挑戰是選擇「processname」的值,鍵入標籤到一個新的字段,稱爲processName和「processtageid」的值到一個新的字段,所以我可以做這些值的總和。

任何幫助將不勝感激。

回答

2

你想爲最有效的方式$filter$size

{ "$group": { 
    "_id": "$primaryProcessName", 
    "Total": { "$sum": 1 }, 
    "InProcess": { 
    "$sum": { 
     "$size": { 
     "$filter": { 
      "input": "$tag", 
      "as": "t", 
      "cond": { 
      "$and": [ 
       { "$eq": [ "$$t.key", "processstageid" ] }, 
       { "$eq": [ "$$t.value","inprocess"] } 
      ] 
      } 
     } 
     } 
    } 
    }, 
    "Complete": { 
    "$sum": { 
     "$size": { 
     "$filter": { 
      "input": "$tag", 
      "as": "t", 
      "cond": { 
      "$and": [ 
       { "$eq": [ "$$t.key", "processstageid" ] }, 
       { "$eq": [ "$$t.value","complete"] } 
      ] 
      } 
     } 
     } 
    } 
    }, 
    "Faulted": { 
    "$sum": { 
     "$size": { 
     "$filter": { 
      "input": "$tag", 
      "as": "t", 
      "cond": { 
      "$and": [ 
       { "$eq": [ "$$t.key", "processstageid" ] }, 
       { "$eq": [ "$$t.value","faulted"] } 
      ] 
      } 
     } 
     } 
    } 
    } 
}} 

$filter有它自己的條件,我們可以使用$and相匹配的數組元素的不同屬性的多個條件。這將數組減少爲僅匹配的條目,然後您可以採取這種方式$size

+0

神奇,非常感謝尼爾 - 作品像一個魅力! –

+0

@JohannMarx不要忘記[接受你的答案](https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) –

+0

完成,再次感謝!我應該提到一件事:我必須從這一行中取出$中的一個才能使其正常工作: {「$ eq」:[「$$$ t.value」,「faulted」]} –