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


83

ドキュメントを挿入するとします。

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

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

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

回答:


108

pymongo
mycollection.update({'_id':mongo_id}, {"$set": post}, upsert=False)
では、次のように更新できます。投稿がデータベースに見つからない場合、更新する代わりにUpsertパラメーターが挿入されます。
ドキュメントはmongodbサイトで入手できます。

UPDATEバージョン> 3の使用のためにupdate_one代わりの更新

mycollection.update_one({'_id':mongo_id}, {"$set": post}, upsert=False)


1
@ Elliott-他の選択肢は何ですか?
ajayramesh 2017年

29
mycollection.find_one_and_update({"_id": mongo_id}, 
                                 {"$set": {"newfield": "abc"}})

あなたのために見事に働くはずです。idのドキュメントがない場合は、mongo_idも使用しない限り失敗しますupsert=True。これにより、デフォルトで古いドキュメントが返されます。新しいものを入手するには、を渡しreturn_document=ReturnDocument.AFTERます。すべてのパラメータはAPIで説明されています

このメソッドはMongoDB3.0で導入されました。3.2、3.4、および3.6に拡張されました。


2
「username」fyiのような別のフィールドに「_id」をサブサブする場合にも機能します
Chris

1
@Chris「現在のpymongo」と言うと、将来の私たちと同じバージョンではないかもしれません。具体的にするのはいいことです。
Mnebuerquo 2018年

@Mnebuerquoこれは、他の方法では見られなかった優れたポイントです。将来の投稿で行います、thx。
クリス

@Chris編集は大いに役立ちます。ありがとう!そして未来からの感謝-私がこれを忘れて、それをもう一度調べなければならないとき私!
Mnebuerquo 2018年

22

私は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を返します。


9

これは古い質問ですが、答えを探すときに偶然見つけたので、参考のために答えを更新したいと思いました。

メソッドsaveupdateは非推奨です。

save(to_save、manipulate = True、check_keys = True、** kwargs)¶このコレクションにドキュメントを保存します。

非推奨-代わりにinsert_one()またはreplace_one()を使用してください。

バージョン3.0で変更:safeパラメーターを削除しました。未確認の書き込み操作にはw = 0を渡します。

update(spec、document、upsert = False、manipulate = False、multi = False、check_keys = True、** kwargs)このコレクションのドキュメントを更新します。

非推奨-代わりにreplace_one()、update_one()、またはupdate_many()を使用してください。

バージョン3.0で変更:safeパラメーターを削除しました。未確認の書き込み操作にはw = 0を渡します。

OPの特定のケースでは、を使用することをお勧めしますreplace_one


9

「ドキュメントの挿入」というタイトルの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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.