Powiedzmy, że wstawiam dokument.
post = { some dictionary }
mongo_id = mycollection.insert(post)
Teraz powiedzmy, że chcę dodać pole i zaktualizować je. Jak mogę to zrobić? To chyba nie działa .....
post = mycollection.find_one({"_id":mongo_id})
post['newfield'] = "abc"
mycollection.save(post)
mycollection.find_one_and_update({"_id": mongo_id}, {"$set": {"newfield": "abc"}})
powinien działać znakomicie dla Ciebie. Jeśli nie ma dokumentu o identyfikatorze
mongo_id
, zakończy się niepowodzeniem, chyba że użyjesz równieżupsert=True
. To domyślnie zwraca stary dokument. Aby zdobyć nowy, zdajreturn_document=ReturnDocument.AFTER
. Wszystkie parametry są opisane w API .Metoda została wprowadzona w MongoDB 3.0. Został przedłużony do wersji 3.2, 3.4 i 3.6.
źródło
Wykorzystam
collection.save(the_changed_dict)
ten sposób. Właśnie to przetestowałem i nadal działa. Poniższy cytat pochodzi bezpośrednio zpymongo doc.
:save(to_save[, manipulate=True[, safe=False[, **kwargs]]])
źródło
To jest stare pytanie, ale natknąłem się na to, szukając odpowiedzi, więc chciałem podać aktualizację odpowiedzi w celach informacyjnych.
Metody
save
iupdate
są przestarzałe.w konkretnym przypadku PO lepiej jest użyć
replace_one
.źródło
Zgodnie z najnowszą dokumentacją dotyczącą PyMongo zatytułowaną Wstaw dokument (wstawka jest przestarzała) i zgodnie z podejściem obronnym, należy wstawiać i aktualizować w następujący sposób:
result = mycollection.insert_one(post) post = mycollection.find_one({'_id': result.inserted_id}) if post is not None: post['newfield'] = "abc" mycollection.save(post)
źródło