сохранение устарело для чего в pymongo?

Я читаю документы из коллекций MongoDB с помощью pymongo, затем изменяю их, а затем сохраняю обратно с помощью сохранить.

К сожалению, я начал получать предупреждение об устаревании:

DeprecationWarning: save is deprecated. Use insert_one or replace_one instead

Рекомендуемые замены имеют различную функциональность: insert_one жалуется на дубликаты, _id и update_one требует параметр фильтра.

Как отключить предупреждение об устаревании?


person Dims    schedule 21.10.2017    source источник
comment
К вашему сведению, прочитать->изменить->сохранить — худший шаблон из всех, отсюда и образовательный урок по удалению функции из драйвера. По сути, вы идете в библиотеку и берете книгу, идете домой, затем садитесь за письменный стол, добавляете новую страницу в книгу, затем, наконец, идете обратно в библиотеку и ставите книгу на полку< /я>. Противоположные действия в update_one или replace_one по существу заключаются в отправке новой страницы библиотекарю с просьбой добавить ее в номинированную книгу. Таким образом, вы действительно должны изучить различие между шаблонами.   -  person Neil Lunn    schedule 22.10.2017
comment
Я не согласен с существованием плохих или хороших моделей. Даже я вообще не согласен с существованием паттернов.   -  person Dims    schedule 22.10.2017


Ответы (2)


если документ, который вы хотите сохранить, уже имеет _id, используйте replace_one иначе используйте insert_one

if '_id' in doc:    
    collection.replace_one({'_id': doc['_id']}, doc)
else:
    collection.insert_one(doc)

сохранить не будет поддерживается в будущих версиях pymongo, лучше прекратить его использование.

person daemon24    schedule 23.10.2017
comment
Что делать, если в коллекции еще нет документа с данным _id? Параметр upsert по умолчанию имеет значение False. - person Dims; 24.10.2017
comment
P.S. Нормально ли отказываться от функции с четкой функциональностью для длинных фрагментов кода с множеством потенциальных источников ошибок? - person Dims; 24.10.2017
comment
Да. Методы будут объявлены устаревшими, если будет улучшена производительность. - person daemon24; 24.10.2017
comment
Чтобы ответить на ваш предыдущий запрос, если в коллекции нет документа, то вы, очевидно, будете использовать insert_one, который вставит новый документ. - person daemon24; 24.10.2017
comment
if перейдет к первой ветке, потому что в документе есть _id - person Dims; 24.10.2017
comment
Это не атомарная операция. - person fabio.sang; 08.04.2019

Если вы читаете документ и модифицируете его, а затем заменяете документ на сервере измененной копией, то вам следует использовать replace_one:

doc = collection.find_one()
doc['key'] = value
collection.replace_one({'_id': doc['_id']}, doc)

Однако, если вы намерены обновить конкретное поле в документе, тогда update_one будет быстрее (требуется одно обращение к серверу вместо двух) и безопаснее (он не подвержен одинаковым условиям гонки при обновлении нескольких процессов). тот же документ).

person A. Jesse Jiryu Davis    schedule 21.10.2017
comment
Вы имели в виду, что collection.replace_one({'_id': doc['_id']}, doc) эквивалентно save? - person Dims; 22.10.2017
comment
Да, это то, что я имею в виду. - person A. Jesse Jiryu Davis; 22.10.2017
comment
Что делать, если в коллекции еще нет документа, а также еще нет _id в doc? Сохранение обрабатывало это автоматически. - person Dims; 23.10.2017
comment
Чтобы вставить документ, если его там нет, установите для необязательного параметра upsert значение true. См. документацию @ docs.mongodb.com/manual/reference/method/ - person Isuru; 24.06.2019