Node.js 使用mongoDB推送值时更新平均值

Node.js 使用mongoDB推送值时更新平均值,node.js,mongodb,Node.js,Mongodb,我有一个文档结构如下的集合: { id : 1, datasets : [ { version : 1.1, data : [{x: 0, y: 1}, {x: 1, y: 2}], xAverage: 0.5, } ] } 我的目标是使xAverage在每次向数据数组添加新点时都进行更新 我使用updateOne添加新值,如下所示: collection.updat

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

{
    id : 1,
    datasets : [
        {
            version : 1.1,
            data : [{x: 0, y: 1}, {x: 1, y: 2}],
            xAverage: 0.5,
        }
    ]
}
我的目标是使
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()

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


谢谢。

使用
数据集
数据
数组上的
展开
,可以计算x值的平均值:

db.getCollection('<your-collection>').aggregate([{
            "$unwind": {
                path: "$datasets"
            }
        }, {
            "$unwind": {
                path: "$datasets.data"
            }
        }, {
            "$group": {
                "_id": "$id",
                "xAverage": {
                    "$avg": "$datasets.data.x"
                }
            }
        }
    ])
上面的聚合将返回

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

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

您可以添加当前用于插入的nodejs代码吗?@eol node.js code added
{
    "_id" : 2,
    "xAverage" : 13.3333333333333
},
{
    "_id" : 1,
    "xAverage" : 7.0
}