2017-05-01 24 views
0

MongoDBで作成したドキュメントをpymongoでどのように更新できますか?例えばMongoDBのカーソル文書をpymongoで更新するには?

:私は、データセットを持っている:

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

あなたはreplace_one()を使用して以下のように、新しいフィールドtotalでコレクションを更新することができます。

代わりに、コレクションをループして1で文書1を保存するの、あなたはまた、必要があることは注目に値する
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"} 
]); 

weightamountフィールドの乗算結果の値を使用して新しいフィールドtotal突出上記アグリゲーションパイプライン。結果をfruits_modifiedという別のコレクションに保存します。 その後、fruitsコレクションをドロップし、例えば、スワップするfruits_modifiedの名前を変更することができます。コレクションはを削除している間に実行されているすべての操作が失われる可能性があること

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

注意。両方の方法を検討し、ユースケースに従って使用してください。

+0

こんにちは@Wan Bachtiar、答えに感謝します。しかし、私はまだ "save()"に関する質問を持っています。警告: "DeprecationWarning:saveは非推奨です。代わりにinsert_oneまたはreplace_oneを使用してください"。ですから、insert_one()またはreplace_one()を使用すると、最初のパラメータとしてフィルタを指定する必要があります。本当ですか? – xirururu

+0

私はあなたの質問に答えるためのコードを更新しました。これで、[ObjectId](https://docs.mongodb.com/manual/reference/method/ObjectId/)の値が一致するドキュメントを検索し、計算されたドキュメントに置き換えます。 –

関連する問題