ドキュメントを挿入するとします。
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)
では、次のように更新できます。投稿がデータベースに見つからない場合、更新する代わりにUpsertパラメーターが挿入されます。
ドキュメントはmongodbサイトで入手できます。
UPDATEバージョン> 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で説明されています。
このメソッドはMongoDB3.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の場合、「_ id」がto_saveに追加され、このメソッドは保存されたドキュメントの「_id」を返します。操作がFalseの場合、「_ id」はサーバーによって追加されますが、このメソッドはNoneを返します。
これは古い質問ですが、答えを探すときに偶然見つけたので、参考のために答えを更新したいと思いました。
メソッドsave
とupdate
は非推奨です。
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
。