当前位置: 首页 > 知识库问答 >
问题:

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

龙智
2023-03-14

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

我可以从mongodb文档中获取旧值并计算平均值,并将其设置到字段中,但这不是线程安全性,在计算平均值时,mongodb文件中的旧值可能会更改。

示例,文档:

{ ' _ id ':ObjectId(" 55d 49338 b 9796 c 337 c 894 df 3 "),值:10 }

Python代码:

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

以前:

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

共有1个答案

宗政才俊
2023-03-14

您可以使用聚合框架进行更新。执行此操作所需的管道步骤是$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中,使用<code>$project

new_value = 15
db.mycollection.aggregate([
    { "$project": {
        "value": { "$avg":  ["$value", new_value] }
    } },
    { "$out": "mycollection" }
])
 类似资料:
  • 在我的用例中,我希望使用spring-data-mongo一次更新多个文档,即与查询匹配的文档。 这是我一直在尝试的, MongoDB-3.6 spring-data-mongoDB-1.5.5.release

  • 问题内容: 我有以下形式的mongodb集合: 让值字典为。我需要更新中的键值。即我想更改为 pymongo中的该怎么办? 代码是这样的: 现在在productData中反映新值。 这是我尝试过的方法,它引入了一个新的键值对,而不是更新 问题答案: 如果要将文档的值设置为任意值,可以使用$ set语法。如果该属性已经存在于文档中,则将更新值;如果不存在,则将创建该值。如果您需要像描述的那样在字典中

  • MongoDB 是一个开源的数据库,它存储着灵活的类-JSON 的“文档”。与关系数据库中的数据行相反,它能够存储任何的数字,名称,或者复杂的层级结构。Python 开发者可以考虑把 MongoDB 作为一个持久化,可搜索的 Python 字典的“仓库”(实际上,这是如何用 PyMongo 来表示 MongoDB 中的“文档”)。 Flask-PyMongo 架起来 Flask 和 PyMongo

  • 我试图跟踪文档中特定字段的更改。这是我的用户类。我想用Javers记录count中的任何变化。 我添加了以下代码来跟踪何时创建新的用户对象。 这是使用MongoTemplate的updateCount方法: 现在我想跟踪的是在updateCount方法调用结束时提交某种更改。但是除非我有一个实体对象,否则这些更改无法提交。我该怎么做?

  • 使用Spring data mongo驱动程序,我想使用单个查询更新mongob中的多个文档,这些文档将具有不同的更新值。我尝试了以下代码,但它对所有符合查询条件的文档具有相同的更新值。 有没有办法用不同的值更新所有文档?

  • 我想要的是返回整个cidr数组。 我使用的是Mongo3.2和pymongo(Python3.7)