Comment puis-je mettre à jour un document Mongo après l'avoir inséré?
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)
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)