从阵列到新场的条件计数值

时间:2017-06-06 13:06:53

标签: mongodb aggregation-framework

考虑以下数据:

{ 
    "_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"进入一个新领域,这样我就可以对这些价值进行总结。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分: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