'average。$ avg'中以美元($)为前缀的字段'$ avg'无效。

时间:2019-08-22 11:42:13

标签: mongodb mongodb-query aggregation-framework aggregation

我正在尝试在mongo update函数的set子句中使用$ avg函数,但出现错误。 enter image description here  我正在使用mongo文档中的命令(https://docs.mongodb.com/manual/reference/method/db.collection.update/示例2)。

正如sushant mehta所建议的那样,我已经在4.2版的shell中进行了尝试,其中上述命令运行正常。基本上,我想在update命令的set子句中使用逻辑表达式,如下所示: enter image description here

我知道switch语句中的逻辑表达式都将导致错误,我只是在尝试探索。在Shell版本3.0.8中有没有办法做到这一点?

2 个答案:

答案 0 :(得分:0)

$avg是一个聚合管道运算符,您不能将其与低于4.2的Mongodb版本的更新一起使用。检查在什么阶段可用$avg

要解决此问题(如果您使用的是较低版本的mongo,请首先通过$project

查找测试的平均值)
var results = db.collection.aggregate([{
    $project: {
        testsAvg: {
            $avg: "$tests"
        }
    }
}]);

哪个输出:

{
  "_id" : ObjectId("5d5e996a5871068e0c9da406"),
  "testsAvg" : 92.33333333333333
}
{
  "_id" : ObjectId("5d5e996a5871068e0c9da407"),
  "testsAvg" : 90.66666666666667
}
{
  "_id" : ObjectId("5d5e996a5871068e0c9da408"),
  "testsAvg" : 75.66666666666667
}

然后基于这些ID,您可以通过遍历结果来更新文档并更新每条记录的平均值。

while (results.hasNext()) {
    var doc = results.next();
    db.collection.update({_id: doc._id},
                  { "$set": { "testAvg": doc.testsAvg }});
}

答案 1 :(得分:0)

对于Mongodb文档,我也遇到同样的问题。

如果尝试对内部字段使用update或计算新字段,则必须将其放入数组中。

针对您的错误。 这样做。

db.students3.update(    { },  [ { $set: { average : { $avg: ["$a","$b"] } } }]  ,{ multi: true } )

对我来说很好。

您的问题
从MongoDB 4.2开始,这是一个聚合管道,用于修改匹配的文档。
它不适合版本3.0。 但是您可以找到并迭代数据并计算值,然后进行更新。