web-dev-qa-db-ja.com

update_oneを使用してレコードをアップサートするとValueErrorが発生するのはなぜですか?

キーがまだ存在しない場合は、コレクションにレコードを追加します。 [MongoDB] [1]がこのためにupsertを提供しているので、

_db.collection.update({"_id":"key1"},{"_id":"key1"},True) 
_

これはうまくいくようです。

ただし、 Pymongo documentation では、更新は非推奨であり、update_one()に使用されると書かれています。

だが:

_db.collection.update_one({"_id":"key1"},{"_id":"key1"},True)
_

与える:

_raise ValueError('update only works with $ operators')
ValueError: update only works with $ operators
_

なぜ_update_one_が異なるのか、なぜ_$_演算子を使用する必要があるのか​​はよくわかりません。誰でも助けることができますか?

31
johhny B

これは、 更新演算子 を指定しなかったためです。たとえば $setid値の使用:

db.collection.update_one({"_id":"key1"}, {"$set": {"id":"key1"}}, upsert=True)

Mongo Shellでは、これは単にドキュメントを新しいドキュメントに置き換えることに注意してください。

39
styvane

replace_one()の代わりにupdate_one()を使用します。 replace_one()の3番目のパラメーターもupsertです。

_db.collection.replace_one({"_id": "key1"}, {"_id": "key1"}, True) 
_

私個人の意見では、このupdate_one()の実装はMongoDBクライアントの動作と矛盾しています。 update_one()upsertオプションは実際には無意味です。しかし、pyMongoの開発者は、これを使用してupdate_one()replace_one()を区別したい場合があります。

14
George Lei