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



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



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


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



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

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

    Ничего не найдено.