Подтвердить что ты не робот

Как обновить Mongo-документ после его вставки?

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

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

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

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

Ответ 1

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

UPDATE Для версии > 3 используйте update_one вместо обновления:

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

Ответ 2

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

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

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

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

Ответ 3

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

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

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

DEPRECATED - вместо этого используйте insert_one() или replace_one().

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

update (spec, document, upsert = False, manipulate = False, multi = False, check_keys = True, ** kwargs) Обновить документ в этой коллекции.

DEPRECATED - используйте replace_one(), update_one() или update_many() вместо этого.

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

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

Ответ 4

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

Ответ 5

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

должен отлично работать для вас. Если нет документа id mongo_id, он будет терпеть неудачу, если вы также не используете upsert=True. Это возвращает старый документ по умолчанию. Чтобы получить новый, пройдите return_document=ReturnDocument.AFTER. Все параметры описаны в API.