【问题标题】:MongoDB aggregation: Average of acumulated values possible?MongoDB聚合:可能的累积值平均值?
【发布时间】:2018-06-05 18:05:44
【问题描述】:

我想知道是否可以对不同文档值的总和进行 $avg。我的文档结构如下:

    time: { type: Number, required: true },
    date: { type: Date, required: true },
    reg: {
      hi: { type: Number, default: 0 },
      mid: { type: Number, default: 0 },
      low: { type: Number, default: 0 },
      null: { type: Number, default: 0 }
    },
    area: { type: mongoose.Schema.Types.ObjectId, ref: 'Area', required: true }

这是集合中的三个示例文档:

{
    "_id" : ObjectId("5a2c64237a651d3cc2dc2da1"),
    "time" : 1510193369104,
    "date" : ISODate("2017-11-09T02:09:29.104Z"),
    "area" : ObjectId("5a236b2309391a0febfac0c9"),
    "reg" : {
        "hi" : 59,
        "mid" : 35,
        "low" : 1573,
        "null" : 4733
    }
}
{
    "_id" : ObjectId("5a2c64237a651d3cc2dc2da5"),
    "time" : 1510193369104,
    "date" : ISODate("2017-11-09T02:09:29.104Z"),
    "area" : ObjectId("5a236b2309391a0febfac0a9"),
    "reg" : {
        "hi" : 0,
        "mid" : 0,
        "low" : 2018,
        "null" : 4382
    }
}
{
    "_id" : ObjectId("5a2c64247a651d3cc2dc2df4"),
    "time" : 1510193369104,
    "date" : ISODate("2017-11-09T02:09:29.104Z"),
    "area" : ObjectId("5a236b2309391a0febfac11b"),
    "reg" : {
        "hi" : 57,
        "mid" : 235,
        "low" : 1909,
        "null" : 4199
    }
}

对于每个文档,我需要乘以:“reg.hi”乘以 3,“reg.mid”乘以 2,“reg.low”乘以 1。然后,将三个结果相加得到平均值。

我不知道这是否可以在聚合查询中完成,我尝试了很多方法都没有成功。

这是一个,至少,作为结果抛出了一个有效的数字(注意我正在使用 $match 过滤文档,但这不应该打扰)。

Log.aggregate([{
          $group: {
            _id: { area: "$area" },
            avg: {
              $avg: {
                $sum: { 
                   $multiply: ["$reg.low", 1], 
                   $multiply: ["$reg.mid", 2], 
                   $multiply: ["$reg.hi", 3] 
                }
              }
            }
          }
        }
    ])

提前致谢!

【问题讨论】:

  • 嗨!欣赏架构,但给我们 3 或 4 个实际输入文档。看起来您要进行加权平均,并且您已经步入正轨(减去除以 5),但请告诉我们您要寻找什么输出,我相信会有一个可以满足的查询。
  • @BuzzMoschetti 很酷,感谢您的建议。我已经添加了三个示例文档!谢谢

标签: node.js mongodb mongoose aggregation-framework aggregate


【解决方案1】:

好吧,如果您想对每个文档进行乘法和平均,那么只需使用$addFields

db.foo.aggregate([
  {$addFields: { theAverage: {$avg: [
      {$multiply: ["$reg.low", 1]}
     ,{$multiply: ["$reg.mid", 2]}
     ,{$multiply: ["$reg.hi", 3]}
                        ]}
  }}
]);

【讨论】:

    【解决方案2】:

    您的运算符配对不正确。使用$sum 变体,它采用操作数表达式列表。每个操作数都是一个文档。

    试试这个

    Log.aggregate([{"$group":{
      "_id":{"area":"$area"},
      "avg":{
        "$avg":{
          "$sum":[
            {"$multiply":["$reg.low",1]},
            {"$multiply":["$reg.mid",2]},
            {"$multiply":["$reg.hi",3]}
           ]
        }
      }
    }}])
    

    【讨论】:

      猜你喜欢
      • 2016-07-11
      • 2012-06-19
      • 2019-03-25
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 2015-11-19
      相关资源
      最近更新 更多