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)
È stato utile?

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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top