我有一个文档结构如下的集合:
{
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()
。
更新此类对象的正确方法是什么?
谢谢。
在dataset
和data
阵列上使用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
字段。