web-dev-qa-db-fra.com

Comment mettre à jour un document Mongo après l'avoir inséré?

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)
75
TIMEX

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)

99
allait
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.

26
serv-inc

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.

22
Andrew_1510

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 .

9
ThinkBonobo

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)
8
Gürol Canbek