Почему перезагрузка записи с помощью 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().