MongoDB子文件的$sum和$avg

MongoDB子文件的$sum和$avg,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我需要得到$sum和$avg的子文档,我想得到$sum和$avg的通道[0]。。以及其他渠道。 我的数据结构如下所示 { _id : ... Location : 1, Channels : [ { _id: ..., Value: 25 }, { _id: ... , Value: 39 }, {

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

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

为了获得集合中每个文档的通道的
值和平均值,您需要使用mongodb的处理。此外,由于
通道
是一个数组,因此需要使用运算符来解构数组

假设您的集合被称为
示例
,下面是如何获得
通道的文档总和和平均值。值
s:

db.example.aggregate( [ 
    { 
        "$unwind" : "$Channels"
    }, 
    {
        "$group" : {
            "_id" : "$_id",
            "documentSum" : { "$sum" : "$Channels.Value" },
            "documentAvg" : { "$avg" : "$Channels.Value" }
         }
    }
] )
您的帖子数据的输出将是:

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

如果您的集合中有多个文档,则您将看到每个文档的结果行,其中包含一个
频道
数组。

解决方案1:基于此示例使用两个组:

解决方案2: 有一个属性我没有在我的原始问题上显示,它可能对“Channels.Id”独立于“Channels.\u Id”有所帮助


你问题的措辞有点混乱。您是否试图为查询中的每个文档获取
通道
元素中所有
元素的总和和平均值?我使用我的数据库运行了上述代码,其中有10条记录,每条记录有4条通道,它生成了一个包含109个项目的数组,而不是数组大小为通道数组长度的对象,但这帮我找到了解决办法你有109张唱片?嗯,真奇怪。无论如何,似乎您不想按文档(即,按_id)对总和和平均数进行分组。相反,您希望根据通道的索引进行分组。这在你的帖子中并不清楚,但是,我现在明白了。这正是我所做的,很抱歉,我对我的问题不是很具体
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'
                   }}
         }
     }
   ]
)
db.records.aggregate( [ 
    { 
        "$unwind" : "$Channels"
    }, 
    {
        "$group" : {
            "_id" : "$Channels.Id",
            "documentSum" : { "$sum" : "$Channels.Value" },
            "documentAvg" : { "$avg" : "$Channels.Value" }
         }
    }
] )