Mongoドキュメントを挿入した後に更新するにはどうすればよいですか?
質問
ドキュメントを挿入したとしましょう。
post = { some dictionary }
mongo_id = mycollection.insert(post)
さて、フィールドを追加して更新したいとしましょう。それ、どうやったら出来るの?これはうまくいかないようです.....
post = mycollection.find_one({"_id":mongo_id})
post['newfield'] = "abc"
mycollection.save(post)
解決
ピモンゴでは、次のように更新できます。
mycollection.update({'_id':mongo_id}, {"$set": post}, upsert=False)
UPSERTパラメーターは、データベースに投稿が見つからない場合に更新する代わりに挿入します。
ドキュメントはで利用できます Mongodbサイト.
アップデート バージョン> 3の使用 update_one それ以外の アップデート:
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」を含む既存のドキュメントが上書きされます。それ以外の場合、挿入()操作が実行されます。この場合、操作がtrueの場合、「_id」がto_saveに追加され、このメソッドは保存されたドキュメントの「_id」を返します。操作がfalseである場合、「_id」はサーバーによって追加されますが、この方法は何も返されません。
これは古い質問ですが、答えを探しているときに私はこれにつまずいたので、参照のために答えの更新をしたいと思いました。
方法 save
と update
非推奨です。
save(to_save、manipulate = true、check_keys = true、** kwargs)¶このコレクションにドキュメントを保存します。
DepRECATED -INSERT_ONE()またはLEST_ONE()を代わりに使用します。
バージョン3.0で変更されました:安全なパラメーターを削除しました。承認されていない書き込み操作の場合はw = 0を渡します。
update(spec、document、upsert = false、manipulate = false、multi = false、check_keys = true、** kwargs)このコレクションのドキュメントを更新します。
deprecated-代わりにdeplest_one()、update_one()、またはupdate_many()を使用してください。
バージョン3.0で変更されました:安全なパラメーターを削除しました。承認されていない書き込み操作の場合はw = 0を渡します。
OPSの特定のケースでは、使用する方が良いです replace_one
.
「タイトル」というタイトルに関する最新のドキュメントによると ドキュメントを挿入します (挿入は非推奨)、次の防御的アプローチでは、次のように挿入して更新する必要があります。
result = mycollection.insert_one(post)
post = mycollection.find_one({'_id': result.inserted_id})
if post is not None:
post['newfield'] = "abc"
mycollection.save(post)