Disons que j'insère 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)
Dans pymongo, vous pouvez mettre à jour avec:mycollection.update({'_id':mongo_id}, {"$set": post}, upsert=False)
Le paramètre Upsert sera inséré au lieu de se mettre à jour si la publication n’est pas trouvée dans la base de données.
La documentation est disponible à l’adresse site mongodb .
[~ # ~] update [~ # ~] Pour la version> 3, utilisez update_one au lieu de mettre à jour:
mycollection.update_one({'_id':mongo_id}, {"$set": post}, upsert=False)
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'identifiant mongo_id
, il échouera, sauf si vous utilisez également upsert=True
. Cela renvoie l'ancien document par défaut. Pour obtenir le nouveau, passez 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é pour 3.2, 3.4 et 3.6.
Je vais utiliser collection.save(the_changed_dict)
de cette façon. Je viens de tester cela, et ça marche toujours pour moi. Ce qui suit est cité directement de pymongo doc.
:
save(to_save[, manipulate=True[, safe=False[, **kwargs]]])
Enregistrer un document dans cette collection.
Si to_save a déjà un "_id", une opération update () (upsert) est exécutée et tout document existant contenant ce "_id" est écrasé. Sinon, une opération insert () est effectuée. Dans ce cas, si manipuler vaut True, un "_id" sera ajouté à to_save et cette méthode retournera le "_id" du document enregistré. Si manipuler vaut False, "_id" sera ajouté par le serveur mais cette méthode retournera None.
C'est une vieille question, mais je suis tombé sur cette question en cherchant la réponse. Je voulais donc mettre à jour la réponse pour référence.
Les méthodes save
et update
sont obsolètes.
save (to_save, manipulate = True, check_keys = True, ** kwargs) ¶ Enregistrez un document dans cette collection.
DEPRECATED - Utilisez plutôt insert_one () ou replace_one ().
Modifié dans la version 3.0: Suppression du paramètre sécurisé. Passez w = 0 pour les opérations d'écriture non acquittées.
update (spéc, document, upsert = False, manipulate = False, multi = False, check_keys = True, ** kwargs) Met à jour un ou plusieurs documents de cette collection.
DEPRECATED - Utilisez plutôt replace_one (), update_one () ou update_many ().
Modifié dans la version 3.0: Suppression du paramètre sécurisé. Passez w = 0 pour les opérations d'écriture non acquittées.
dans le cas particulier des PO, il vaut mieux utiliser replace_one
.
Selon la dernière documentation sur PyMongo intitulée Insérer un document (l'insertion est obsolète) et à la suite d'une approche défensive, vous devez l'insérer et la 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)