我正在尝试在mongo update函数的set子句中使用$ avg函数,但出现错误。 我正在使用mongo文档中的命令(https://docs.mongodb.com/manual/reference/method/db.collection.update/示例2)。
正如sushant mehta所建议的那样,我已经在4.2版的shell中进行了尝试,其中上述命令运行正常。基本上,我想在update命令的set子句中使用逻辑表达式,如下所示:
我知道switch语句中的逻辑表达式都将导致错误,我只是在尝试探索。在Shell版本3.0.8中有没有办法做到这一点?
答案 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。
但是您可以找到并迭代数据并计算值,然后进行更新。