我想更新现有 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/