我有一个带有如下文档结构的集合:
{
id : 1,
datasets : [
{
version : 1.1,
data : [{x: 0, y: 1}, {x: 1, y: 2}],
xAverage: 0.5,
}
]
}
我的目标是每次将新点添加到xAverage
数组时使data
更新。
我正在使用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()
。
更新此类对象的正确方法是什么?
谢谢。
在unwind
和dataset
数组上使用data
,可以计算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
字段及其结果。