Mongoドキュメントを挿入した後に更新するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/4372797

質問

ドキュメントを挿入したとしましょう。

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」はサーバーによって追加されますが、この方法は何も返されません。

これは古い質問ですが、答えを探しているときに私はこれにつまずいたので、参照のために答えの更新をしたいと思いました。

方法 saveupdate 非推奨です。

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)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top