Допустим, я вставляю документ.
post = { some dictionary }
mongo_id = mycollection.insert(post)
Теперь предположим, что я хочу добавить поле и обновить его. Как я могу это сделать? Похоже, это не работает ...
post = mycollection.find_one({"_id":mongo_id})
post['newfield'] = "abc"
mycollection.save(post)
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.
источник
Я буду использовать
collection.save(the_changed_dict)
этот способ. Я только что протестировал это, и он все еще работает у меня. Следующее цитируется непосредственно изpymongo doc.
:save(to_save[, manipulate=True[, safe=False[, **kwargs]]])
источник
Это старый вопрос, но я наткнулся на него, когда искал ответ, поэтому я хотел дать обновленный ответ для справки.
Методы
save
иupdate
устарели.в частном случае OP лучше использовать
replace_one
.источник
Согласно последней документации о PyMongo под названием Insert a Document (вставка устарела) и следующему защитному подходу, вы должны вставить и обновить следующим образом:
result = mycollection.insert_one(post) post = mycollection.find_one({'_id': result.inserted_id}) if post is not None: post['newfield'] = "abc" mycollection.save(post)
источник