MongoDB $ sum和$ avg子文档

时间:2015-08-26 18:46:39

标签: mongodb aggregation-framework

我需要获得$ sum和$ avg子文档,我想得到$ sum和$ avg的Channels [0] ..以及其他频道。 我的数据结构如下所示

{  
   _id : ...  Location : 1,  
   Channels : [   
     {    _id: ...,
          Value: 25
     },   
     {    
          _id: ... ,   
          Value: 39   
     },
     {    
          _id: ..,
          Value: 12   
     }
     ] 
}

2 个答案:

答案 0 :(得分:2)

为了获得集合中每个文档的Channels.Value元素的总和平均值,您需要使用mongodb的Aggregation处理。此外,由于Channels是一个数组,因此您需要使用$unwind运算符来解构数组。

假设您的馆藏名为example,以下是您如何同时获得Channels.Value的文件总和和平均值:

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

帖子数据的输出为:

{ 
    "_id" : SomeObjectIdValue,
    "documentSum" : 76,
    "documentAvg" : 25.333333333333332
}

如果您的收藏集中有多个文档,那么您将看到包含Channels数组的每个文档的结果行。

答案 1 :(得分:0)

解决方案1:根据此示例使用两个组: previous question

db.records.aggregate(
   [
     { $unwind: "$Channels" },
     { $group: {
           _id: {
               "loc" : "$Location",
               "cId" : "$Channels.Id"
           },
           "value" : {$sum : "$Channels.Value" },
           "average" : {$avg : "$Channels.Value"},
           "maximun" : {$max : "$Channels.Value"},
           "minimum" : {$min : "$Channels.Value"}
     }},
     { $group: {
             _id : "$_id.loc",
           "ChannelsSumary" : { $push : 
               {   "channelId" : '$_id.cId', 
                   "value" :'$value', 
                   "average" : '$average',
                   "maximun" :  '$maximun',
                   "minimum" :  '$minimum'
                   }}
         }
     }
   ]
)

解决方案2: 我没有在我的原始问题上显示的属性可能有助于“Channels.Id”独立于“Channels._Id”

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