文書を挿入するとしましょう。
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)
投稿がデータベースで見つからない場合、更新ではなく更新パラメータが挿入されます。
ドキュメントは mongodbサイト で入手できます。
[〜#〜] update [〜#〜]バージョン> 3の場合、update_oneの代わりにupdate:
mycollection.update_one({'_id':mongo_id}, {"$set": post}, upsert=False)
mycollection.find_one_and_update({"_id": mongo_id},
{"$set": {"newfield": "abc"}})
あなたのために素晴らしいはずです。 ID mongo_id
のドキュメントがない場合、upsert=True
も使用しない限り、ドキュメントは失敗します。これはデフォルトで古いドキュメントを返します。新しいものを取得するには、return_document=ReturnDocument.AFTER
を渡します。すべてのパラメーターは API で説明されています。
このメソッドは、MongoDB 3.0で導入されました。 3.2、3.4、および3.6に拡張されました。
このようにcollection.save(the_changed_dict)
を使用します。私はこれをテストしましたが、それでも私には有効です。以下は_pymongo doc.
_から直接引用されています。
save(to_save[, manipulate=True[, safe=False[, **kwargs]]])
このコレクションにドキュメントを保存します。
To_saveに既に「_id」がある場合、update()(upsert)操作が実行され、その「_id」を持つ既存のドキュメントは上書きされます。それ以外の場合、insert()操作が実行されます。この場合、manipulateがTrueの場合、to_saveに「_id」が追加され、このメソッドは保存されたドキュメントの「_id」を返します。操作がFalseの場合、サーバーによって「_id」が追加されますが、このメソッドはNoneを返します。
これは古い質問ですが、答えを探しているときにつまずいたので、参照用に答えを更新したかったのです。
メソッドsave
およびupdate
は非推奨です。
save(to_save、操作= True、check_keys = True、** kwargs)¶このコレクションにドキュメントを保存します。
非推奨-代わりにinsert_one()またはreplace_one()を使用してください。
バージョン3.0で変更:安全なパラメーターが削除されました。未確認の書き込み操作にはw = 0を渡します。
update(spec、document、upsert = False、操作= False、multi = False、check_keys = True、** kwargs)このコレクション内のドキュメントを更新します。
非推奨-代わりにreplace_one()、update_one()、またはupdate_many()を使用してください。
バージョン3.0で変更:安全なパラメーターが削除されました。未確認の書き込み操作にはw = 0を渡します。
oPの特定のケースでは、 replace_one
。
ドキュメントの挿入 (挿入は非推奨)というタイトルの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)