如何使用pymongo更新MongoDB中的游标文档?

时间:2017-05-01 00:36:49

标签: python mongodb pymongo

如何使用pymongo更新MongoDB中创建的文档?

例如:我有一个数据集:

name    weight    amount
-------------------------
apple     2         3
banana    2         5

我想得到水果的重量:重量*数量

name    weight    amount    total
-----------------------------------
apple     2         3        6
banana    2         5        10

如何更新光标文件????

myFile = [
    {"name":"Appel", "weight":2, "amount":3}, {"name":"banana", "weight":2, "amount":5}   
]

myCollection.insert_many(myFile)

fruits = myCollection.find()

for fruit in fruits:
    total = fruit["weight"]*fruit["amount"]
    ????? What should I do now? ?????

1 个答案:

答案 0 :(得分:1)

您可以使用新字段total更新集合,如下所示replace_one()

for fruit in fruits:
  fruit["total"] = fruit["weight"] * fruit["amount"]
  myCollection.replace_one({"_id": fruit["_id"]}, fruit)

值得注意的是,您应该考虑使用PyMongo Bulk Write Operations,而不是循环整个集合并逐个保存文档,尤其是Unordered Bulk Write Operations

根据您的使用情况,您也可以使用Aggregation Pipeline来计算服务器端值:

db.fruits.aggregate([
  {$project:{name:1, 
           weight:1, 
           amount:1, 
           total:{$multiply:["$weight", "$amount"]}}},
  {$out:"fruits_modified"}
]);

上面的聚合管道,使用totalweight字段的乘法结果值投影新字段amount。将结果保存到名为fruits_modified的其他集合中。 然后,您可以删除fruits集合,并重命名fruits_modified以进行交换,例如:

db.fruits.drop();
db.fruits_modified.renameCollection("fruits");

请注意,在删除集合时正在执行的任何操作可能会丢失。考虑两种方法,并根据您的用例使用。