Come faccio ad aggiornare un documento Mongo dopo averlo inserito?
Domanda
Diciamo che ho Inserire il documento.
post = { some dictionary }
mongo_id = mycollection.insert(post)
Ora, diciamo che voglio aggiungere un campo e aggiornarlo. Come lo faccio? Questo non sembra al lavoro .....
post = mycollection.find_one({"_id":mongo_id})
post['newfield'] = "abc"
mycollection.save(post)
Soluzione
In pymongo è possibile aggiornare con:
mycollection.update({'_id':mongo_id}, {"$set": post}, upsert=False)
parametro upsert inserirà invece di aggiornare se il post non è stato trovato nel database.
La documentazione è disponibile presso MongoDB sito .
Aggiorna Per la versione> 3 utilizzo update_one al posto di update :
mycollection.update_one({'_id':mongo_id}, {"$set": post}, upsert=False)
Altri suggerimenti
mycollection.find_one_and_update({"_id": mongo_id},
{"$set": {"newfield": "abc"}})
dovrebbe funzionare splendidamente per voi. Se non v'è alcun documento di identificazione mongo_id
, fallirà, a meno che non si utilizza anche upsert=True
. Ciò restituisce il vecchio documento di default. Per ottenere il nuovo, passare return_document=ReturnDocument.AFTER
. Tutti i parametri sono descritti nella API .
Il metodo è stato introdotto per MongoDB 3.0. E 'stato prorogato per 3.2, 3.4 e 3.6.
I userà collection.save(the_changed_dict)
in questo modo. Ho appena provato questo, e funziona ancora per me. Il seguente è citato direttamente da pymongo doc.
:
save(to_save[, manipulate=True[, safe=False[, **kwargs]]])
Salva un documento in questa collezione.
Se to_save ha già un "_ID" poi viene eseguita un'operazione di aggiornamento () (upsert) e qualsiasi documento esistente con quel "_id" è sovrascritto. Altrimenti un'operazione di inserimento () viene eseguita. In questo caso in cui se manipolare è vero un "_ID" sarà aggiunto alla to_save e questo metodo restituisce il "_id" del documento salvato. Se manipolare è False il "_ID" verrà aggiunta dal server, ma questo metodo restituirà Nessuno.
Questa è una vecchia questione, ma mi sono imbattuto su questo quando alla ricerca di una risposta così ho voluto dare l'aggiornamento alla risposta di riferimento.
I metodi save
e update
sono deprecati.
Salva (to_save, manipolare = TRUE check_keys = TRUE ** kwargs) ¶ Salva un documento in questa collezione.
DISAPPROVATO -. Utilizzare insert_one () o replace_one () al posto
Modificato nella versione 3.0: Rimosso il parametro di sicurezza. Passare w = 0 per le operazioni di scrittura non riconosciuta.
update (spec, documento, upsert = FALSE, manipolare = False, multi = False, check_keys = True, ** kwargs) aggiorna un documento (s) in questa collezione.
DISAPPROVATO - Usa replace_one (), update_one (), o update_many () invece.
Modificato nella versione 3.0: Rimosso il parametro di sicurezza. Passare w = 0 per le operazioni di scrittura non riconosciuta.
nel caso particolare PO, è meglio utilizzare replace_one
.
Secondo l'ultima documentazione relativa PyMongo intitolato inserire un documento (inserto è deprecato) e seguendo approccio difensivo, si dovrebbe inserire e aggiornamento come segue:
result = mycollection.insert_one(post)
post = mycollection.find_one({'_id': result.inserted_id})
if post is not None:
post['newfield'] = "abc"
mycollection.save(post)