使用pymongo

时间:2017-05-10 13:06:39

标签: python mongodb

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

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

示例,文档:

  

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

Python代码:

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

在:

  

{       &#39; _id&#39;:ObjectId(&#34; 55d49338b9796c337c894df3&#34;),       值:12.5}

1 个答案:

答案 0 :(得分: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" }
])