2015-08-28 111 views
0

我很难尝试运行一些嵌套的查询和数组内条目的条件语句。嵌套的条件MongoDB查询

这就是我的文档的样子。 我想获得一个总结,如总和平均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

使用项目级的组步前场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" } 
} 
+0

我需要做出细微的变化,以得到它的工作我加入{$放松:“$通道”}项目之前,改变了“$ Channels.Value”为“$ Channels.value”上“documentSum”:{“$ sum”:“$ Channels.Value”}, “documentAvg”:{“$ avg”:“$ Channels.Value”}, – kahizer