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

问题描述 投票:1回答:1

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

{
    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()

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

谢谢。

node.js mongodb
1个回答
0
投票

unwinddataset数组上使用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字段及其结果。

© www.soinside.com 2019 - 2024. All rights reserved.