首页 文章

使用pymongo更新Mongo文档中的平均值

提问于
浏览
1

我想更新存在的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}

1 回答

  • 2

    您可以使用聚合框架进行更新 . 您需要的管道步骤是 $addFields$out . $addFields 运算符允许您使用表达式的结果替换集合中的现有字段,这将使算术运算符 $avg 计算平均值 .

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

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

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

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

    或使用 $project 作为MongoDB 3.2

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

相关问题