【问题标题】:MongoDB $sum and $avg of sub documents子文档的 MongoDB $sum 和 $avg
【发布时间】:2015-08-26 18:46:38
【问题描述】:

我需要得到 $sum 和 $avg 的子文档,我想得到 $sum 和 $avg 的 Channels[0].. 和其他频道。 我的数据结构是这样的

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

【问题讨论】:

  • 你问题的措辞有点混乱。您是否尝试获取查询中 每个文档Channels 元素中所有 Value 元素的总和和平均值?

标签: mongodb aggregation-framework


【解决方案1】:

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

假设您的集合称为example,以下是您如何获得Channels.Values 的文档总和和平均值:

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

您帖子数据的输出将是:

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

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

【讨论】:

  • 我运行上面的代码,我的数据库有 10 条记录,每条记录有 4 个通道,它生成了一个包含 109 个项目的数组的对象,而不是数组大小是通道数组的长度,但它有帮助我得到解决方案
  • 您有 109 条记录?嗯,这很奇怪。无论如何,您似乎想按文档(即按_id)对总和和平均值进行分组。相反,您希望按 Channel 的索引进行分组。您的帖子中并不清楚,但是,我现在明白了。
  • 这正是我所做的,很抱歉我的问题不是很具体
【解决方案2】:

解决方案 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" }
         }
    }
] )

【讨论】:

    猜你喜欢
    • 2015-03-09
    • 1970-01-01
    • 2011-11-11
    • 2012-09-18
    • 2022-01-26
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 2021-12-25
    相关资源
    最近更新 更多