Почему перезагрузка записи с помощью update_one повысит значение ValueError?
Я хочу добавить запись в коллекцию, если ключ еще не существует. Я понимаю, что [MongoDB] [1] предлагает upsert
для этого, поэтому я сделал
db.collection.update({"_id":"key1"},{"_id":"key1"},True)
Это похоже на работу.
Однако в документации Pymongo говорится, что обновление устарело и используется для 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
отличается и почему мне нужно использовать оператор $
. Может ли кто-нибудь помочь?
Ответы
Ответ 1
Это связано с тем, что вы не указали оператор .
Например, $set
значение id
используется:
db.collection.update_one({"_id":"key1"}, {"$set": {"id":"key1"}}, upsert=True)
Обратите внимание, что в оболочке Mongo это просто заменит документ новым документом.
Ответ 2
Используйте replace_one()
вместо update_one()
. третий параметр replace_one()
тоже upsert
.
db.collection.replace_one({"_id": "key1"}, {"_id": "key1"}, True)
Мое личное мнение заключается в том, что эта реализация update_one()
несовместима с поведением клиента MongoDB. Опция upsert
в update_one()
фактически бессмысленна. Но разработчики pyMongo могут просто хотеть использовать это, чтобы различать update_one()
и replace_one()
.