web-dev-qa-db-ja.com

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

文書を挿入するとしましょう。

post = { some dictionary }
mongo_id = mycollection.insert(post)

ここで、フィールドを追加して更新したいとします。それ、どうやったら出来るの?これはうまくいかないようです。

post = mycollection.find_one({"_id":mongo_id}) 
post['newfield'] = "abc"
mycollection.save(post)
75
TIMEX

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)

99
allait
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に拡張されました。

26
serv-inc

このように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を返します。

22
Andrew_1510

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

メソッド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

9
ThinkBonobo

ドキュメントの挿入 (挿入は非推奨)というタイトルの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)
8
Gürol Canbek