【问题标题】:Update to average value in Mongo document with pymongo使用 pymongo 更新 Mongo 文档中的平均值
【发布时间】:2017-10-09 03:47:25
【问题描述】:

我想更新现有 mongodb 文档中的字段。但是设定值应该是旧值和新值的平均值。

我可以从 mongodb 文档中获取旧值并计算平均值,然后设置到字段中,但这不是线程安全的,当我计算平均值时,mongodb 文档中的旧值可能会发生变化。

示例,文档:

{ '_id': ObjectId("55d49338b9796c337c894df3"), 值:10 }

Python 代码:

# new_value = 15, therefore average_value = 12.5
db.mycollection.update_one(
    {'_id': '55d49338b9796c337c894df3'},
    {...} <- What there?
)

之前:

{ '_id': ObjectId("55d49338b9796c337c894df3"), 值:12.5 }

【问题讨论】:

    标签: python mongodb


    【解决方案1】:

    您可以使用聚合框架进行更新。为此,您需要的管道步骤是 $addFields$out$addFields 运算符允许您将集合中的现有字段替换为来自 一个表达式,它将涉及算术运算符 $avg 来计算平均值。

    $avg 运算符,如果在$project(或$addFields)阶段使用,可以接受表达式列表,使用该列表您可以从现有字段推送值和计算平均值的新值 这两个。

    作为最后阶段的 $out 运算符将在将聚合管道的结果文档写入集合时更新现有集合。

    下面的例子描述了上面伪装成聚合操作的更新操作:

    new_value = 15
    db.mycollection.aggregate([
        { "$addFields": {
            "value": { "$avg":  ["$value", new_value] }
        } },
        { "$out": "mycollection" }
    ])
    

    或在 MongoDB 3.2 中使用 $project 作为

    new_value = 15
    db.mycollection.aggregate([
        { "$project": {
            "value": { "$avg":  ["$value", new_value] }
        } },
        { "$out": "mycollection" }
    ])
    

    【讨论】:

    猜你喜欢
    • 2015-11-18
    • 1970-01-01
    • 2021-06-22
    • 2015-11-02
    • 1970-01-01
    • 2015-04-29
    • 2014-10-24
    • 2021-11-30
    • 2015-08-27
    相关资源
    最近更新 更多