Как обновить документ Mongo после его вставки? - PullRequest
75 голосов
/ 07 декабря 2010

Допустим, я вставляю документ.

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

Теперь, допустим, я хочу добавить поле и обновить его.Как я могу это сделать?Это не похоже на работу .....

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

Ответы [ 5 ]

99 голосов
/ 07 декабря 2010

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

ОБНОВЛЕНИЕ Для версии> 3 используйте update_one вместо update :

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

25 голосов
/ 06 октября 2017
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.

22 голосов
/ 14 августа 2012

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

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

Сохранить документ в этой коллекции.

Если to_save уже имеет "_id", тогдавыполняется операция update () (upsert), и любой существующий документ с этим «_id» перезаписывается.В противном случае выполняется операция вставки ().В этом случае, если значение «Управлять» - «Истина», к to_save добавляется «_id», и этот метод возвращает «_id» сохраненного документа.Если манипулировать имеет значение False, сервер добавит _id, но этот метод вернет None.

9 голосов
/ 20 августа 2015

Это старый вопрос, но я наткнулся на него, когда искал ответ, поэтому я хотел дать обновление для ответа для справки.

Методы save и update устарели.

сохранить (to_save, манипулировать = True, check_keys = True, ** kwargs) ¶ Сохранить документ в этой коллекции.

УСТАРЕЛО. Вместо этого используйте insert_one () или replace_one ().

Изменено в версии 3.0: удален безопасный параметр. Пройти w = 0 для неподтвержденные операции записи.

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

УСТАРЕЛО - Используйте replace_one (), update_one () или update_many () вместо этого.

Изменено в версии 3.0: удален безопасный параметр. Пройти w = 0 для неподтвержденные операции записи.

в конкретном случае ОП лучше использовать replace_one.

8 голосов
/ 04 декабря 2016

В соответствии с последней документацией о 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)
...