Як оновити документ Mongo після його вставки?


83

Скажімо, я вставляю документ.

post = { some dictionary }
mongo_id = mycollection.insert(post)

Тепер, припустимо, я хочу додати поле та оновити його. Як це зробити? Здається, це не працює .....

post = mycollection.find_one({"_id":mongo_id}) 
post['newfield'] = "abc"
mycollection.save(post)

Відповіді:


108

У pymongo ви можете оновити за допомогою:
mycollection.update({'_id':mongo_id}, {"$set": post}, upsert=False)
Параметр Upsert буде вставлений замість оновлення, якщо повідомлення не знайдено в базі даних.
Документація доступна на сайті mongodb .

ОНОВЛЕННЯ Для версії> 3 використовуйте update_one замість оновлення :

mycollection.update_one({'_id':mongo_id}, {"$set": post}, upsert=False)


1
@Elliott - яка інша альтернатива?
аджайрамеш,

29
mycollection.find_one_and_update({"_id": mongo_id}, 
                                 {"$set": {"newfield": "abc"}})

повинен чудово працювати для вас. Якщо документа ідентифікатора немає mongo_id, він не вдасться, якщо ви також не використовуєте його upsert=True. Це повертає старий документ за замовчуванням. Щоб отримати новий, пройдіть return_document=ReturnDocument.AFTER. Усі параметри описані в API .

Метод був введений для MongoDB 3.0. Він був продовжений на 3.2, 3.4 та 3.6.


2
Це також працює, якщо ви вказали "_id" для іншого поля, такого як "ім'я користувача" fyi
Кріс,

1
@Chris Коли ви говорите "поточний pymongo", у нас з майбутнього може бути не така версія. Приємно бути конкретним.
Mnebuerquo

@Mnebuerquo, це чудовий момент, якого я б не бачив інакше. Буду робити в майбутніх повідомленнях, thx.
Кріс

@Chris Редагування дуже допомагає. Дякую! І подяка від майбутнього-мене, коли я забув про це і мав шукати це знову!
Mnebuerquo

22

Я скористаюся collection.save(the_changed_dict)цим способом. Я щойно перевірив це, і воно все ще працює для мене. Наступне цитується безпосередньо з pymongo doc.:

save(to_save[, manipulate=True[, safe=False[, **kwargs]]])

Збережіть документ у цій колекції.

Якщо to_save вже має "_id", тоді виконується операція оновлення () (upsert) і будь-який існуючий документ із цим "_id" замінюється. В іншому випадку виконується операція вставки (). У цьому випадку, якщо значення "Маніпуляція" має значення "", буде додано "_id" до to_save, і цей метод повертає "_id" збереженого документа. Якщо маніпуляція має значення False, сервер додасть "_id", але цей метод поверне None.


9

Це старе запитання, але я натрапив на це, шукаючи відповідь, тому хотів дати оновлення відповіді для довідки.

Методи saveта updateзастаріли.

зберегти (to_save, manipulate = True, check_keys = True, ** kwargs) ¶ Зберегти документ у цій колекції.

DEPRECATED - Замість цього використовуйте insert_one () або replace_one ().

Змінено у версії 3.0: Вилучено параметр safe. Прохід w = 0 для непідтверджених операцій запису.

оновити (специфікація, документ, upsert = False, маніпулювати = False, multi = False, check_keys = True, ** kwargs) Оновити документи в цій колекції.

ЗНИЖЕНО - Замість цього використовуйте replace_one (), update_one () або update_many ().

Змінено у версії 3.0: Вилучено параметр safe. Прохід w = 0 для непідтверджених операцій запису.

в окремому випадку ОП, краще використовувати replace_one.


9

Згідно з останньою документацією про PyMongo під назвою Вставка документа (вставка застаріла) та, застосовуючи захисний підхід, слід вставити та оновити наступним чином:

result = mycollection.insert_one(post)
post = mycollection.find_one({'_id': result.inserted_id})

if post is not None:
    post['newfield'] = "abc"
    mycollection.save(post)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.