2017-06-06 18 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)と "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

素晴らしいです、ありがとうございますNeil - 魅力的な作品です! –

+0

@JohannMarx [あなたの回答を受け入れる](忘れないでください)(https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) –

+0

完了、もう一度!私は1つのことを言及するべきです:私はこの行から$のうちの1つを取り出してそれを動作させる必要がありました: {"$ eq":["$$$ t.value"、 "faulted"]} –