Question

Nous allons dire je insérer le document.

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

Maintenant, disons que je veux ajouter un champ et le mettre à jour. Comment je fais ça? Cela ne semble pas fonctionner .....

post = mycollection.find_one({"_id":mongo_id}) 
post['newfield'] = "abc"
mycollection.save(post)
Était-ce utile?

La solution

Dans pymongo vous pouvez mettre à jour avec:
mycollection.update({'_id':mongo_id}, {"$set": post}, upsert=False)
paramètre upsert insérera au lieu de la mise à jour si le poste ne se trouve pas dans la base de données.
La documentation est disponible à l'adresse mongodb le site .

UPDATE Pour la version> 3 utiliser update_one au lieu de mise à jour :

mycollection.update_one({'_id':mongo_id}, {"$set": post}, upsert=False)

Autres conseils

mycollection.find_one_and_update({"_id": mongo_id}, 
                                 {"$set": {"newfield": "abc"}})

devrait fonctionner à merveille pour vous. S'il n'y a pas de document d'identité mongo_id, il échouera, à moins que vous utilisez également upsert=True. Cela renvoie l'ancien document par défaut. Pour obtenir le nouveau, passer return_document=ReturnDocument.AFTER. Tous les paramètres sont décrits dans l'API .

La méthode a été introduite pour MongoDB 3.0. Il a été prolongé de 3,2, 3,4 et 3,6.

Je vais utiliser collection.save(the_changed_dict) cette façon. Je viens de tester cela, et il fonctionne toujours pour moi. Ce qui suit est directement cité pymongo doc.:

save(to_save[, manipulate=True[, safe=False[, **kwargs]]])

  

Enregistrer un document dans cette collection.

     

Si to_save a déjà un « _id », puis   une opération update () (upsert) est effectuée et   tout document existant que « _id » est   écrasé. Sinon, une opération d'insertion () est exécutée. Dans ce   cas si vrai est un manipuler « _id » sera ajouté à to_save et ce   méthode renvoie le « _id » du document enregistré. Si manipuler est faux   le « _id » sera ajouté par le serveur, mais cette méthode retourne   Aucun.

Ceci est une vieille question, mais je suis tombé sur ce lorsque vous cherchez la réponse si je voulais donner la mise à jour à la réponse de référence.

Les méthodes save et update sont dépréciées.

  

save (to_save, = True, manipuler check_keys = True, ** kwargs) ¶ Enregistrer une   documents dans cette collection.

     

PÉRIMÉ -. Utilisation insert_one () ou replace_one () à la place

     

Changement dans la version 3.0: Suppression du paramètre de sécurité. Passe w = 0 pour   opérations d'écriture non reconnue.

     

mise à jour (spécification, document, upsert = Faux, manipuler = Faux, multi = False,   check_keys = True, ** kwargs) Mettre à jour un document (s) dans cette collection.

     

PÉRIMÉ - Utilisation replace_one (), update_one () ou update_many ()   à la place.

     

Changement dans la version 3.0: Suppression du paramètre de sécurité. Passe w = 0 pour   opérations d'écriture non reconnue.

dans le cas particulier OPs, il est préférable d'utiliser replace_one .

Selon la dernière documentation sur PyMongo intitulé Insérer un document (insert est dépréciée) et suivant l'approche défensive, vous devez insérer et mettre à jour comme suit:

result = mycollection.insert_one(post)
post = mycollection.find_one({'_id': result.inserted_id})

if post is not None:
    post['newfield'] = "abc"
    mycollection.save(post)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top