嵌套条件MongoDB查询

时间:2015-08-28 22:58:31

标签: mongodb aggregation-framework

我很难尝试使用数组中项目的条件语句运行一些嵌套查询。

这就是我的文档的样子。 我希望获得每个摘要,例如 sum average alarmedCount (每次Channels.AlarmStatus ==“报警时计数”) “频道”基于Channels.Id。我得到了总和和平均值,但无法获得alarmedCount

的正确查询
{
  "_id"       : "55df8e4cd8afa4ccer1915ee"
  "location"  : "1",
  "Channels" : [{
    "_id"          : "55df8e4cdsafa4cc0d1915r1",
    "ChannelId"    : 1,
    "Value"        : 14,
    "AlarmStatus"  : "normal"
    },
    {
    "_id"          : "55df8e4cdsafa4cc0d1915r9",
    "ChannelId"    : 2,
    "Value"        : 20,
    "AlarmStatus"  : "alarmed"
    },
    {
    "_id"          : "55df8e4cdsafa4cc0d1915re",
    "ChannelId"    : 3,
    "Value"        : 10,
    "AlarmStatus"  : "alarmed"},
  ]
}
    {
  "_id"       : "55df8e4cd8afa4ccer1915e0"
  "location"  : "1",
  "Channels" : [{
    "_id"          : "55df8e4cdsafa4cc0d19159",
    "ChannelId"    : 1,
    "Value"        : 50,
    "AlarmStatus"  : "normal"
    },
    {
    "_id"          : "55df8e4cdsafa4cc0d1915re",
    "ChannelId"    : 2,
    "Value"        : 16,
    "AlarmStatus"  : "normal"
    },
    {
    "_id"          : "55df8e4cdsafa4cc0d1915g7",
    "ChannelId"    : 3,
    "Value"        : 9,
    "AlarmStatus"  : "alarmed"},
  ]
}

我让它去分组并展示一些计算 使用此聚合

db.records.aggregate( [ 
    { 
        "$unwind" : "$Channels"
    }, 
    {
        "$group" : {
            "_id" : "$Channels.Id",
            "documentSum" : { "$sum" : "$Channels.Value" },
            "documentAvg" : { "$avg" : "$Channels.Value" }
         }
    }
] )

结果如下:

{
    "result" : [ 
        {
            "_id" : 1,
            "documentSum" : 64,
            "documentAvg" : 32
        },
        {
            "_id" : 2,
            "documentSum" : 36,
            "documentAvg" : 18
        },
        {
            "_id" : 3,
            "documentSum" : 19,
            "documentAvg" : 9.5
        }, 
    ],
    "ok" : 1.0000000000000000
}

我想得到这种结果

{
        "result" : [ 
            {
                "_id" : 1,
                "documentSum" : 64,
                "documentAvg" : 32,
                "AlarmedCount" : 0
            },
            {
                "_id" : 2,
                "documentSum" : 36,
                "documentAvg" : 18,
                "AlarmedCount" : 1
            },
            {
                "_id" : 3,
                "documentSum"  : 19,
                "documentAvg"  : 9.5,
                "AlarmedCount" : 2
            } 
        ],
        "ok" : 1.0000000000000000
    }

1 个答案:

答案 0 :(得分:1)

在小组步骤之前使用项目步骤将字段AlarmedStatus转换为10,具体取决于其值:

$project: {
     "Channels.value":"$Channels.Value",
     "Channels.AlarmCount":{ $cond: { 
           if: { $eq: ["$Channels.AlarmedStatus", "alarmed"] }, 
           then: 1, 
           else: 0 } 
     }
}

然后将新创建的字段求和以获得聚合计数:

$group : {
     "_id" : "$Channels.Id",
     "documentSum" : { "$sum" : "$Channels.Value" },
     "documentAvg" : { "$avg" : "$Channels.Value" },
     "AlarmCount"  : { "$sum" : "$Channels.AlarmCount" }
 }
相关问题