ドキュメントを挿入するとします。
post = { some dictionary }
mongo_id = mycollection.insert(post)
ここで、フィールドを追加して更新したいとします。それ、どうやったら出来るの?これはうまくいかないようです.....
post = mycollection.find_one({"_id":mongo_id})
post['newfield'] = "abc"
mycollection.save(post)
pymongo では次のように更新できます:
mycollection.update({'_id':mongo_id}, {"$set": post}, upsert=False)
投稿がデータベースに見つからない場合、更新の代わりに Upsert パラメータが挿入されます。
ドキュメントはmongodb サイトで入手できます。
UPDATEバージョン > 3の場合、 updateの代わりにupdate_oneを使用します。
mycollection.update_one({'_id':mongo_id}, {"$set": post}, upsert=False)
私はcollection.save(the_changed_dict)
このように使用します。私はこれをテストしたばかりですが、それでも機能します。以下はから直接引用されていpymongo doc.
ます:
save(to_save[, manipulate=True[, safe=False[, **kwargs]]])
このコレクションにドキュメントを保存します。
to_saveにすでに「_id」がある場合は、update()(upsert)操作が実行され、その「_id」を持つ既存のドキュメントが上書きされます。それ以外の場合は、insert()操作が実行されます。この場合、manipulateがTrueの場合、「_ id」がto_saveに追加され、このメソッドは保存されたドキュメントの「_id」を返します。操作がFalseの場合、「_ id」はサーバーによって追加されますが、このメソッドはNoneを返します。
Insert a Document (insert is deprecated)というタイトルの PyMongo に関する最新のドキュメントと次の防御的なアプローチによると、次のように挿入して更新する必要があります。
result = mycollection.insert_one(post)
post = mycollection.find_one({'_id': result.inserted_id})
if post is not None:
post['newfield'] = "abc"
mycollection.save(post)
これは古い質問ですが、回答を探しているときにこれに出くわしたので、参考のために回答を更新したいと思いました。
メソッドsave
およびupdate
は非推奨です。
save(to_save, manage=True, check_keys=True, **kwargs)¶ ドキュメントをこのコレクションに保存します。
非推奨 - 代わりに insert_one() または replace_one() を使用してください。
バージョン 3.0 で変更: safe パラメータを削除しました。未確認の書き込み操作には w=0 を渡します。
update(spec, document, upsert=False, manage=False, multi=False, check_keys=True, **kwargs) このコレクション内のドキュメントを更新します。
非推奨 - 代わりに、replace_one()、update_one()、または update_many() を使用してください。
バージョン 3.0 で変更: safe パラメータを削除しました。未確認の書き込み操作には w=0 を渡します。
OP の特定のケースでは、 を使用することをお勧めしますreplace_one
。