Les fonctions ,update,updateOne , UpdateMany

ces fonctions permettent de modifier la valeur d'un ou plusieur document selon une condition(selection)
syntaxe
db.nomCollection.updateONEorMany({condition},{attributàModifié},{Options})

updateOne()

modifier ou ajouter un attribut dans le premier document trouvé selon la condition données exemple:
db.updateOne({"marque":"marque1"},....})
la condition {"marque":"marque1"} :peut trouver plusieur document Mais updateOne va modifier seulement le premier document trouvé

$set et $unset,$inc avec updateOne

$set:permet de modifier la valuer d'un attibut s'il exites ,s'il n'existes pas il sera créer avec la valeur donnée

Exemples

Modifier la marque du produit _id=1 à marqueX
db.produits.updateOne({"_id":1},{$set:{marque:"marqueX"}})
Ajouter le champs color=green au document _id=1
db.produits.updateOne({"_id":1},{$set:{color:"green"}})
supprimer le champs color=green au document _id=1
db.produits.updateOne({"_id":1},{$unset:{color:""}})
incrémenter la quantite du document _id=1 avec 5
db.produits.updateOne({"_id":1},{$inc:{quantite:5}})

update()

fait la meme chose que updateOne Mais avec une liste d'options (multi,...)
Exemple:
modifier la marque à marqueA pour tous les produits du fournisseur nom=fournisseur1
db.produits.update({"fournisseur.nom":"fournisseur1"},{$set:{"marque":"marqueA"}},{multi:true})
{multi:true} :permet de modifier plusieurs document selon la condition donnée

Remarque

On peut utiliser $set , $unset,$inc avec update de la meme façon que updateOne

Remarque

les fonctions updateOne ,update et updateMany vont créer un attribut s'il n'existe pas
Pour intedire la création d'un attribut s'il n'existe pas on ajoute l'option:
{upsert:false}
db.produits.update({"_id":1},{$set:{color:"green"}},{upsert:false})
si le champ {color:"green"} n'existe pas dans le document il ne serra pas crée

Remarque

la méthode update is deprecated ,donc c'est mieux de travailler avec updateOne ou updateMany

updateMany()

Permet de modifier plusieurs documents qui realise la condition fournie
Exemple:
Augmenter le prix par 10$ de tout les produits de la marque 'marque1' et le fournisseur nom=fournisseur3
db.produits.updateMany({"marque":"marque1","fournisseur.nom":"fournisseur3"},{$inc:{"prix":10}})

Remarque

La condition {"marque":"marque1","fournisseur.nom":"fournisseur3"}
peut etre écrite avec l'opérateur $and ::
{$and:[{"marque":"marque1"},{"fournisseur.nom":"fournisseur3"}]
On peut utiliser $set , $unset,$inc avec updateMany de la meme façon que updateOne

Exercices

Modifier le nom du founisseur à founisseur5 pour tous les produits de la marque marqueA
db.produits.updateMany({"marque":"MarqueA"},{$set:{"founisseur.nom":"fournisseur5"}})
Supprimer le champ color de tous les produits du fournisseur nom=founisseur3
db.produits.updateMany({"fournisseur.nom":"fournisseur3"},{$unset:{"color":""}})
Modifier la marque à marqueC et diminuer le prix par 10 de tous les produits de la marqueB
db.produits.updateMany({"marque":"MarqueB"},{$set:{"marque":"MarqueC"},$inc:{"prix":-10}})

Exemples

  • Q.1puis-je mettre à jour le prix du "produit1" à 50.0 ?
    Réponse 1: Utilisez updateOne() avec l'opérateur $set pour mettre à jour le prix du produit :
    db.produits.updateOne({ nom: "produit1" }, { $set: { prix: 50.0 } })
  • Q.2puis-je ajouter 10 unités à la quantité de "produit1" ?
    Réponse 2: Utilisez updateOne() avec l'opérateur $inc pour ajouter 10 unités à la quantité du produit :
    db.produits.updateOne({ nom: "produit1" }, { $inc: { quantite: 10 } })
  • Q.3puis-je supprimer la catégorie "category2" du produit "produit1" ?
    Réponse 3: Utilisez updateOne() avec l'opérateur $pull pour supprimer la catégorie du produit :
    db.produits.updateOne({ nom: "produit1" }, { $pull: { categories: { nom: "category2" } } })
  • Q.4puis-je ajouter la catégorie "category3" avec une description à "produit1" ?
    Réponse 4: Utilisez updateOne() avec l'opérateur $push pour ajouter la nouvelle catégorie au produit :
    db.produits.updateOne({ nom: "produit1" }, { $push: { categories: { _id: 3, nom: "category3", description: "une description de la catégorie3" } } })
  • Q.5puis-je mettre à jour la marque du produit à "marque2" ?
    Réponse 5: Utilisez updateOne() avec l'opérateur $set pour mettre à jour la marque du produit :
    db.produits.updateOne({ nom: "produit1" }, { $set: { marque: "marque2" } })
  • Q.6puis-je ajouter le mois de promotion "avril" à "produit1" ?
    Réponse 6: Utilisez updateOne() avec l'opérateur $push pour ajouter le nouveau mois de promotion au produit :
    db.produits.updateOne({ nom: "produit1" }, { $push: { moisPromotions: "avril" } })
  • Q.7puis-je supprimer le mois de promotion "janvier" de "produit1" ?
    Réponse 7: Utilisez updateOne() avec l'opérateur $pull pour supprimer le mois de promotion du produit :
    db.produits.updateOne({ nom: "produit1" }, { $pull: { moisPromotions: "janvier" } })
  • Q.8puis-je mettre à jour le nom du fournisseur à "fournisseur2" pour "produit1" ?
    Réponse 8: Utilisez updateOne() avec l'opérateur $set pour mettre à jour le nom du fournisseur du produit :
    db.produits.updateOne({ nom: "produit1" }, { $set: { "fournisseurs.nom": "fournisseur2" } })
  • Q.9puis-je mettre à jour le numéro de téléphone du fournisseur à "0311234" pour "produit1" ?
    Réponse 9: Utilisez updateOne() avec l'opérateur $set pour mettre à jour le numéro de téléphone du fournisseur du produit :
    db.produits.updateOne({ nom: "produit1" }, { $set: { "fournisseurs.tel": "0311234" } })
  • Q.10puis-je ajouter le produit "produit2" avec les détails fournis ?
    Réponse 10: Utilisez updateOne() avec l'opérateur upsert pour ajouter le produit s'il n'existe pas ou le mettre à jour s'il existe déjà :
    db.produits.updateOne({ nom: "produit2" }, { $set: { nom: "produit2", prix: 55.0, quantite: 30, categories: [ { _id: 1, nom: "category1", description: "une description de la catégorie1" } ], marque: "marque2", moisPromotions: ["février", "avril"], fournisseurs: { _id: 2, nom: "fournisseur2", tel: "0315678" } } }, { upsert: true })
  • Q.11puis-je mettre à jour tous les produits dont le prix est inférieur à 40 en augmentant leur prix de 10 ?
    Réponse 11: Utilisez updateMany() avec l'opérateur $lt pour sélectionner les produits et $inc pour augmenter leur prix :
    db.produits.updateMany({ prix: { $lt: 40 } }, { $inc: { prix: 10 } })
  • Q.12puis-je ajouter la catégorie "category4" à tous les produits qui n'ont pas encore cette catégorie ?
    Réponse 12: Utilisez updateMany() avec l'opérateur $push pour ajouter la catégorie aux produits qui ne l'ont pas encore :
    db.produits.updateMany({ categories: { $not: { $elemMatch: { nom: "category4" } } } }, { $push: { categories: { _id: 4, nom: "category4", description: "une description de la catégorie4" } } })
  • Q.13puis-je supprimer le mois de promotion "octobre" de tous les produits ?
    Réponse 13: Utilisez updateMany() avec l'opérateur $pull pour supprimer le mois de promotion de tous les produits :
    db.produits.updateMany({}, { $pull: { moisPromotions: "octobre" } })
  • Q.14puis-je supprimer la catégorie "category1" de tous les produits qui ont cette catégorie ?
    Réponse 14: Utilisez updateMany() avec l'opérateur $pull pour supprimer la catégorie de tous les produits qui la possèdent :
    db.produits.updateMany({ categories: { $elemMatch: { nom: "category1" } } }, { $pull: { categories: { nom: "category1" } } })
  • Q.15puis-je supprimer tous les produits ayant une quantité inférieure à 20 ?
    Réponse 15: Utilisez deleteMany() avec l'opérateur $lt pour supprimer tous les produits ayant une quantité inférieure à 20 :
    db.produits.deleteMany({ quantite: { $lt: 20 } })
  • Q.16puis-je mettre à jour le prix de tous les produits en ajoutant 5 % au prix actuel ?
    Réponse 16: Utilisez updateMany() avec l'opérateur $mul pour multiplier le prix par 1.05 (augmentation de 5 %) pour tous les produits :
    db.produits.updateMany({}, { $mul: { prix: 1.05 } })
  • Q.17puis-je supprimer complètement la catégorie "category2" de tous les produits, y compris les produits qui ne l'ont pas ?
    Réponse 17: Utilisez updateMany() avec l'opérateur $pull pour supprimer la catégorie de tous les produits, même s'ils ne la possèdent pas :
    db.produits.updateMany({}, { $pull: { categories: { nom: "category2" } } })
  • Q.18puis-je mettre à jour la marque de tous les produits à "marque3" ?
    Réponse 18: Utilisez updateMany() avec l'opérateur $set pour mettre à jour la marque de tous les produits :
    db.produits.updateMany({}, { $set: { marque: "marque3" } })
  • Q.19puis-je ajouter le mois de promotion "mai" à tous les produits ?
    Réponse 19: Utilisez updateMany() avec l'opérateur $push pour ajouter le nouveau mois de promotion à tous les produits :
    db.produits.updateMany({}, { $push: { moisPromotions: "mai" } })
  • Q.20puis-je mettre à jour le numéro de téléphone de tous les fournisseurs à "0310000" ?
    Réponse 20: Utilisez updateMany() avec l'opérateur $set pour mettre à jour le numéro de téléphone de tous les fournisseurs :
    db.produits.updateMany({}, { $set: { "fournisseurs.tel": "0310000" } })
  • Q.21puis-je mettre à jour tous les produits dont le prix est supérieur à 60 en diminuant leur prix de 15 % ?
    Réponse 21: Utilisez updateMany() avec l'opérateur $gt pour sélectionner les produits et $mul pour réduire leur prix de 15 % :
    db.produits.updateMany({ prix: { $gt: 60 } }, { $mul: { prix: 0.85 } })
  • Q.22puis-je supprimer la catégorie "category1" de tous les produits qui ont à la fois cette catégorie et le mois de promotion "janvier" ?
    Réponse 22: Utilisez updateMany() avec les opérateurs $elemMatch et $pull pour supprimer la catégorie de ces produits :
    db.produits.updateMany({ categories: { $elemMatch: { nom: "category1" } }, moisPromotions: "janvier" }, { $pull: { categories: { nom: "category1" } } })
  • Q.23puis-je mettre à jour le prix de tous les produits en fonction de leurs catégories, en ajoutant 5 à tous les produits de la catégorie "category1" et en soustrayant 3 à tous les produits de la catégorie "category2" ?
    Réponse 23: Utilisez updateMany() avec l'opérateur $each et $map pour mettre à jour le prix en fonction de la catégorie :
    db.produits.updateMany({}, [
      { $match: { categories: { $elemMatch: { nom: "category1" } } }, $set: { prix: { $add: ["$prix", 5] } } },
      { $match: { categories: { $elemMatch: { nom: "category2" } } }, $set: { prix: { $subtract: ["$prix", 3] } } }
    ])
  • Q.24puis-je supprimer complètement la catégorie "category2" de tous les produits, même s'ils ne l'ont pas ?
    Réponse 24: Utilisez updateMany() avec l'opérateur $unset pour supprimer complètement la catégorie de tous les produits, même s'ils ne l'ont pas :
    db.produits.updateMany({}, { $unset: { categories: "" } })
  • Q.25puis-je mettre à jour le nom du fournisseur à "fournisseur3" pour tous les produits ?
    Réponse 25: Utilisez updateMany() avec l'opérateur $set pour mettre à jour le nom du fournisseur de tous les produits :
    db.produits.updateMany({}, { $set: { "fournisseurs.nom": "fournisseur3" } })
  • Q.26puis-je supprimer le mois de promotion "février" de tous les produits ?
    Réponse 26: Utilisez updateMany() avec l'opérateur $pull pour supprimer le mois de promotion de tous les produits :
    db.produits.updateMany({}, { $pull: { moisPromotions: "février" } })
  • Q.27puis-je ajouter le mois de promotion "juin" à tous les produits ?
    Réponse 27: Utilisez updateMany() avec l'opérateur $push pour ajouter le nouveau mois de promotion à tous les produits :
    db.produits.updateMany({}, { $push: { moisPromotions: "juin" } })
  • Q.28puis-je mettre à jour le numéro de téléphone de tous les fournisseurs à "0319999" ?
    Réponse 28: Utilisez updateMany() avec l'opérateur $set pour mettre à jour le numéro de téléphone de tous les fournisseurs :
    db.produits.updateMany({}, { $set: { "fournisseurs.tel": "0319999" } })
  • Q.29puis-je ajouter un mois de promotion "décembre" à tous les produits ?
    Réponse 29: Utilisez updateMany() avec l'opérateur $push pour ajouter le mois de promotion à tous les produits :
    db.produits.updateMany({}, { $push: { moisPromotions: "décembre" } })
  • Q.30puis-je supprimer complètement la catégorie "category1" de tous les produits, même s'ils ne l'ont pas ?
    Réponse 30: Utilisez updateMany() avec l'opérateur $pull pour supprimer complètement la catégorie de tous les produits, même s'ils ne l'ont pas :
    db.produits.updateMany({}, { $pull: { categories: { nom: "category1" } } })
  • Q.31puis-je mettre à jour le prix de tous les produits de la catégorie "category1" en augmentant leur prix de 10 % ?
    Réponse 31: Utilisez updateMany() avec l'opérateur $set pour mettre à jour le prix des produits de la catégorie "category1" en augmentant de 10 % :
    db.produits.updateMany({ "categories.nom": "category1" }, { $mul: { prix: 1.1 } })
  • Q.32puis-je supprimer le mois de promotion "mars" de tous les produits qui ont la catégorie "category1" ?
    Réponse 32: Utilisez updateMany() avec l'opérateur $pull pour supprimer le mois de promotion "mars" des produits ayant la catégorie "category1" :
    db.produits.updateMany({ "categories.nom": "category1" }, { $pull: { moisPromotions: "mars" } })
  • Q.33puis-je ajouter la catégorie "category3" avec une description à tous les produits qui ont la catégorie "category1" ?
    Réponse 33: Utilisez updateMany() avec l'opérateur $push pour ajouter la nouvelle catégorie aux produits ayant la catégorie "category1" :
    db.produits.updateMany({ "categories.nom": "category1" }, { $push: { categories: { _id: 3, nom: "category3", description: "une description de la catégorie3" } } })
  • Q.34puis-je supprimer la catégorie "category1" de tous les produits qui ont la catégorie "category2" ?
    Réponse 34: Utilisez updateMany() avec l'opérateur $pull pour supprimer la catégorie "category1" des produits ayant la catégorie "category2" :
    db.produits.updateMany({ "categories.nom": "category2" }, { $pull: { categories: { nom: "category1" } } })
  • Q.35puis-je mettre à jour le prix du produit "produit1" en utilisant l'opérateur $inc pour augmenter le prix de 5 ?
    Réponse 35: Utilisez updateOne() avec l'opérateur $inc pour augmenter le prix du produit "produit1" de 5 :
    db.produits.updateOne({ nom: "produit1" }, { $inc: { prix: 5 } })
  • Q.36puis-je supprimer complètement la catégorie "category1" de tous les produits, même s'ils ne l'ont pas ?
    Réponse 36: Utilisez updateMany() avec l'opérateur $unset pour supprimer complètement la catégorie "category1" de tous les produits, même s'ils ne l'ont pas :
    db.produits.updateMany({}, { $unset: { categories: "" } })
  • Q.37puis-je mettre à jour le nom de la catégorie "category1" en "categoryOne" pour tous les produits qui ont cette catégorie ?
    Réponse 37: Utilisez updateMany() avec l'opérateur $set pour mettre à jour le nom de la catégorie "category1" en "categoryOne" pour tous les produits qui ont cette catégorie :
    db.produits.updateMany({ "categories.nom": "category1" }, { $set: { "categories.$.nom": "categoryOne" } })
  • Q.38puis-je ajouter le mois de promotion "juillet" à tous les produits qui ont la catégorie "category1" ?
    Réponse 38: Utilisez updateMany() avec l'opérateur $push pour ajouter le mois de promotion "juillet" à tous les produits ayant la catégorie "category1" :
    db.produits.updateMany({ "categories.nom": "category1" }, { $push: { moisPromotions: "juillet" } })
  • Q.39puis-je mettre à jour la quantité de tous les produits en utilisant l'opérateur $inc pour diminuer la quantité de 5 unités ?
    Réponse 39: Utilisez updateMany() avec l'opérateur $inc pour diminuer la quantité de tous les produits de 5 unités :
    db.produits.updateMany({}, { $inc: { quantite: -5 } })
  • Q.40puis-je ajouter le produit "produit3" avec les détails fournis, en utilisant l'opérateur upsert pour ajouter s'il n'existe pas ou mettre à jour s'il existe déjà ?
    Réponse 40: Utilisez updateOne() avec l'opérateur upsert pour ajouter le produit "produit3" s'il n'existe pas ou le mettre à jour s'il existe déjà :
    db.produits.updateOne({ nom: "produit3" }, { $set: { nom: "produit3", prix: 60.0, quantite: 25, categories: [ { _id: 1, nom: "category1", description: "une description de la catégorie1" } ], marque: "marque3", moisPromotions: ["mai", "juin"], fournisseurs: { _id: 3, nom: "fournisseur3", tel: "0317890" } } }, { upsert: true })