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

标签 python mongodb

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

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

示例,文档:

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

Python 代码:

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

之前:

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

最佳答案

您可以使用聚合框架进行更新。为此所需的管道步骤是 $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" }
])

关于python - 使用 pymongo 更新 Mongo 文档中的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43893419/

相关文章:

python - 在以下情况下如何模拟方法调用?

python - 如何在等待外部服务器的post请求响应时绕过30秒的TTL

通过 pip 安装 Python hunspell 包失败

arrays - 所有数组元素的MongoDB唯一索引

database - 如何查找文档,哪个字段是特定字符串的子字符串?

javascript - 对于从数据库加载的位置,Google map 标记不显示

python - 正则表达式在特定字符前面移动子字符串

python - 使用 plt.subplot2grid() 时如何减少 basemap 子图之间的空白空间

node.js - 索引在Elasticsearch中创建成功,但docs.count变为0

mongodb - 如何使用 Haskell 将某些内容从一个数据库移动到另一个数据库?