Как обновить документ Mongo после его вставки?
допустим, я вставляю в документ.
post = { some dictionary }
mongo_id = mycollection.insert(post)
теперь, допустим, я хочу добавить поле и обновлять его. Как мне это сделать? Это, кажется, не работает.....
post = mycollection.find_one({"_id":mongo_id})
post['newfield'] = "abc"
mycollection.save(post)
5 ответов:
в 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)
Я буду использовать
collection.save(the_changed_dict)этот путь. Я только что проверил это, и это все еще работает для меня. Следующее цитируется непосредственно изpymongo doc.:
save(to_save[, manipulate=True[, safe=False[, **kwargs]]])сохраните документ в этой коллекции.
Если to_save уже имеет "_id", то выполняется операция update () (upsert) и любой существующий документ с этим " _id " является перезаписанный. В противном случае выполняется операция insert (). В этом в случае, если манипуляция истинна, "_id" будет добавлено в to_save и это метод возвращает "_id" сохраненного документа. Если манипулировать ложно "_id" будет добавлен сервером, но этот метод будет возвращен Никто.
mycollection.find_one_and_update({"_id": mongo_id}, {"$set": {"newfield": "abc"}})должно работать великолепно для вас. Если нет документа id
mongo_id, это не удастся, если не использоватьupsert=True. Это возвращает старый документ по умолчанию. Чтобы получить новый, пройдитеreturn_document=ReturnDocument.AFTER. Все параметры описаны в API.метод был введен для MongoDB 3.0. Он был продлен для 3.2, 3.4 и 3.6.
Это старый вопрос, но я наткнулся на это, когда искал ответ, поэтому я хотел дать обновление ответа для справки.
методы
saveиupdateустарели.сохранить(to_save, манипулировать=правда, check_keys=правда, **kwargs)¶ сохранить документ в этой коллекции.
DEPRECATED-вместо этого используйте insert_one() или replace_one ().
изменено в версии 3.0: удален параметр safe. Проход w=0 для неподтвержденные операции записи.
обновление(спецификаций, документ, вставка=ложь, манипуляции=ложь, мульти=ложь, check_keys=True, * * kwargs) обновите документ(ы) в этой коллекции.
устаревший-используйте replace_one (), update_one () или update_many() вместо.
изменено в версии 3.0: удален параметр safe. Проход w=0 для неподтвержденные операции записи.
в частном случае OPs, лучше использовать
replace_one.
согласно последней документации о 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)
Comments