使用mongoDB在值推送时更新平均值



我有一个文档结构如下的集合:

{
id : 1,
datasets : [
{
version : 1.1,
data : [{x: 0, y: 1}, {x: 1, y: 2}],
xAverage: 0.5,
}
]
}

我的目标是在每次向data阵列添加新点时使xAverage更新。

我使用updateOne来添加新值,如:

collection.updateOne({id: req.params.id},
{ $addToSet: { "datasets.$[t].data":  req.body } },
{ arrayFilters: [ { "t.version": req.params.version } ], multi: true}, 
function(err, result) {
if (err) {
res.send(err);
} else {
res.send(result);
}
});

但未能理解如何相应地更新平均值。我试着组合collection.aggregate()

更新此类对象的正确方法是什么?

谢谢。

datasetdata阵列上使用unwind,可以计算x值的平均值:

db.getCollection('<your-collection>').aggregate([{
"$unwind": {
path: "$datasets"
}
}, {
"$unwind": {
path: "$datasets.data"
}
}, {
"$group": {
"_id": "$id",
"xAverage": {
"$avg": "$datasets.data.x"
}
}
}
])

例如,如果您的收藏包含以下两个文档:

{
"id" : 1,
"datasets" : [ 
{
"version" : 1.1,
"data" : [ 
{
"x" : 0.0,
"y" : 1.0
}, 
{
"x" : 1.0,
"y" : 2.0
}, 
{
"x" : 20.0,
"y" : 2.0
}
]
}
]
},
{
"id" : 2,
"datasets" : [ 
{
"version" : 1.1,
"data" : [ 
{
"x" : 19.0,
"y" : 1.0
}, 
{
"x" : 1.0,
"y" : 2.0
}, 
{
"x" : 20.0,
"y" : 2.0
}
]
}
]
}

上述聚合将返回

{
"_id" : 2,
"xAverage" : 13.3333333333333
},
{
"_id" : 1,
"xAverage" : 7.0
}

如果您真的需要将平均值与插入的值一起存储,那么您可以像以前一样插入/附加新的数据点,然后使用上面的聚合查询计算并获得平均值,并使用其结果设置xAverage字段。

最新更新