# data[].attributes.attachment_link.readable_text
Concepts cible:
aggregate(): Méthode permettant d'effectuer des opérations d'agrégation sur les données dans une collection. Elle prend en charge l'utilisation d'un pipeline d'opérations, où chaque opération transforme les documents passés par la précédente.

$match: Opérateur permettant de filtrer les documents de la collection en fonction des critères spécifiés. Il est souvent utilisé en début de pipeline pour réduire le nombre de documents traités dans les étapes suivantes.

$group: Opérateur permettant de regrouper les documents en fonction d'une clé spécifique et d'effectuer des opérations d'agrégation sur les groupes de documents, comme le calcul de la somme, de la moyenne, etc. D'autres opérateurs de cette famille incluent $sum, $avg, $max, $min, $push, $addToSet.

$exists: Opérateur permettant de filtrer les documents qui contiennent un champ spécifique dans leur structure. Il peut être utilisé pour vérifier si un champ existe dans un document ou non.

$size: Opérateur permettant de filtrer les tableaux pour inclure uniquement ceux ayant une taille spécifique. Il peut être utilisé pour rechercher des documents avec des tableaux de longueurs particulières.

$not: Opérateur permettant de filtrer les documents qui ne correspondent pas à un critère donné. Il est souvent utilisé en combinaison avec d'autres opérateurs de comparaison comme $eq, $lt, $gt, etc.

$arrayElemAt: Opérateur permettant d'accéder à un élément spécifique d'un tableau. Il prend en paramètre l'index de l'élément à extraire.

$toInt: Opérateur permettant de convertir une valeur en entier. Il est souvent utilisé pour convertir des valeurs stockées sous forme de chaînes de caractères en entiers ($toDouble: Convertit une valeur en double.
	$toString: Convertit une valeur en chaîne de caractères, $toDate: Convertit une valeur en date, $toBool: Convertit une valeur en booléen).

$project: Opérateur permettant de projeter certains champs des documents tout en excluant les autres. Il est utilisé pour contrôler les champs inclus dans les résultats de la requête.

$unwind: Opérateur permettant de décomposer les tableaux dans les documents en autant de documents distincts. Il est utilisé lorsque vous avez des données de type tableau et que vous voulez les traiter comme des documents individuels.

$first: Opérateur permettant de renvoyer la première valeur d'un groupe. Il est souvent utilisé en conjonction avec $group pour récupérer la première valeur dans chaque groupe.

$limit: Opérateur permettant de limiter le nombre de documents renvoyés par une opération. Il peut être utilisé pour limiter la taille des résultats d'une requête.

$sort: Opérateur permettant de trier les documents selon les critères spécifiés. Il peut être utilisé pour trier les résultats dans un ordre spécifique.

$add: Opérateur permettant d'ajouter des valeurs numériques ou des dates. Il peut être utilisé pour effectuer des opérations d'addition sur les champs numériques ou pour ajouter des intervalles de temps aux dates. D'autres opérateurs de cette famille incluent $subtract, $multiply, $divide, $mod.
========================================================================
-se connecter avec les information d'authentification par default
=> mongosh
=========================================================================
+aggregate():
*exemple 1 : renvoyer la somme des idcli (supérieur ou égal à 2) par prenom (Rq : pour les clients n'ayant pas de champ prenom, ils ne sont pas affichés):
db.client.aggregate(
	{$match:{idcli:{$gte:2}}},
	{$group:{_id:"$prenom", sommeidcli: { $sum: "$idcli"}}}
);


*ex: renvoyer le nombre de commandes par nom et prenom; Rq : le champ 'commandes' DOIT exister pour pouvoir appeler la somme sur sa taille
voir l'exemple en annexe pour explorer l'opérateur $size avant de voir cet exemple; 
db.client.aggregate(
	{$match: {commandes: {$exists:true}}},
	{$group:{_id:{lenom:"$nom",leprenom:"$prenom"}, nbcommandes: { $sum: {$size: "$commandes"}}}}
);


=> exemple annexe; objectif: Renvoyer l'idcli et le nombre de commandes pour chaque client; Rq : le champ 'commandes' DOIT exister 
db.client.aggregate(
	{$match: {commandes:{$exists:true}}},
	{$project:{_id:0, idcli:1, nbCmdes : {$size:"$commandes"}}}
);



*ex 2: renvoyer la somme de qte des PREMIERES commandes par prenom de client (Rq: pour les clients n'ayant pas de champ commandes, 0 est renvoyé)
	l4 = db.client.aggregate([
  {
    $match: {}
  },
  {
    $project: {
      prenom: 1,
      qtePremiereCommande: {
        $toInt: { $arrayElemAt: ["$commandes.qte", 0] }
      }
    }
  },
  {
    $group: {
      _id: "$prenom",
      sommeQtePremiereCommande: { $sum: "$qtePremiereCommande" }
    }
  }
]);
printjson(l4.toArray());


*ex 3: comme 'ex 2'; Cependant, on garde seulement les clients ayant le champ 'commandes' avec une commande au moins
l5 = db.client.aggregate([
  {
    $match: { "commandes": { $exists: true, $not: { $size: 0 } } }
  },
  {
    $project: {
      prenom: 1,
      qtePremiereCommande: {
        $toInt: { $arrayElemAt: ["$commandes.qte", 0] }
      }
    }
  },
  {
    $group: {
      _id: "$prenom",
      sommeQtePremiereCommande: { $sum: "$qtePremiereCommande" }
    }
  }
]);
printjson(l5.toArray());


*ex 4: on renvoie la somme des qte de toutes les commandes par prenom; Rq : utilisation de l'opérateur '$unwind'
db.client.aggregate([
  {
    $match: { "commandes": { $exists: true, $not: { $size: 0 } } }
  },
  {
    $unwind: "$commandes"
  },
  {
    $group: {
      _id: "$prenom",
      sommeQte: { $sum: { $toInt: "$commandes.qte" } }
    }
  }
]);

=>{ $unwind: "$commandes" } ; permet de diviser le tableau de façon à avoir un document par élément du tableau commandes; les autres champs sont dupliqués


*ex 5: renvoyer les 2 premiers groupes; Rq: utilisation de l'opérateur '$first' (contrepartie:$last), $limit
l6 = db.client.aggregate(
	{$group:{_id:"$prenom", premieridcli: { $first: "$idcli"}}},
	{$limit : 2}
);
print(l6);

*ex 6: renvoyer les documents triés; Rq: utilisation $sort, on renvoie les documents qui ne possèdent pas de champ 'nom' en premier lieu
db.client.aggregate(
	{$sort:{nom:1}},
);

*ex 7: renvoyer une somme, une addition, une multiplication, une division et un modulo
db.client.aggregate([
	{
	$project:
		{
		_id : 0,
		idcli :1,
		addition_idcli:{$add:["$idcli",2]}, 
		soustraction_idcli:{$subtract:["$idcli",2]}, 
		multiplication_idcli:{$multiply:["$idcli",2]}, 
		division_idcli:{$divide:["$idcli",2]}, 
		modulo_idcli:{$mod:["$idcli",2]}
	  }
    }
]);


-exprimer des jointures, ex : associer chaque stagiaire à sa filière
use bdformation
stagiaire = db.createCollection("stagiaire")
filiere = db.createCollection("filiere")
db.stagiaire.insert_many([
        {"cne":"100000","nom":"karimi","prenom":"farid","filiere":1},
        {"cne":"100001","nom":"sadiki","prenom":"farid","filiere":2},
        {"cne":"100002","nom":"karimi","prenom":"halima","filiere":1},
        {"cne":"100003","nom":"chakiri","prenom":"amina"},
]);
db.filiere.insert_many([
        {"numero":1,"designation":"Développement Digital"},
        {"numero":2,"designation":"Infrastructure Digitale"},
        {"numero":3,"designation":"Gestion des entreprises"},
]);
=> renvoyer les documents stagiaires avec un champ additionnel(obligatoire) nommé 'filiereStagiaire' dont la valeur est le document filiere qui désigne la filière du stagiaire
db.stagiaire.aggregate([
                        {
                        "$match":{"filiere":{"$exists":true}}
                        },
                        {
                        "$lookup":
                                {
                                "from":"filiere",
                                "localField":"filiere",
                                "foreignField":"numero",
                                "as":"filiereStagiaire"
                                }
                        }
        ]);
		
		
 
-supprimer une collection, ex : produit:
db.produit.drop()

-supprimer une DB, ex : junkdb:
db.dropDatabase('junkdb')           



# data[].attributes.attachment_link.readable_text
Concepts cible:
aggregate(): Méthode permettant d'effectuer des opérations d'agrégation sur les données dans une collection. Elle prend en charge l'utilisation d'un pipeline d'opérations, où chaque opération transforme les documents passés par la précédente.

$match: Opérateur permettant de filtrer les documents de la collection en fonction des critères spécifiés. Il est souvent utilisé en début de pipeline pour réduire le nombre de documents traités dans les étapes suivantes.

$group: Opérateur permettant de regrouper les documents en fonction d'une clé spécifique et d'effectuer des opérations d'agrégation sur les groupes de documents, comme le calcul de la somme, de la moyenne, etc. D'autres opérateurs de cette famille incluent $sum, $avg, $max, $min, $push, $addToSet.

$exists: Opérateur permettant de filtrer les documents qui contiennent un champ spécifique dans leur structure. Il peut être utilisé pour vérifier si un champ existe dans un document ou non.

$size: Opérateur permettant de filtrer les tableaux pour inclure uniquement ceux ayant une taille spécifique. Il peut être utilisé pour rechercher des documents avec des tableaux de longueurs particulières.

$not: Opérateur permettant de filtrer les documents qui ne correspondent pas à un critère donné. Il est souvent utilisé en combinaison avec d'autres opérateurs de comparaison comme $eq, $lt, $gt, etc.

$arrayElemAt: Opérateur permettant d'accéder à un élément spécifique d'un tableau. Il prend en paramètre l'index de l'élément à extraire.

$toInt: Opérateur permettant de convertir une valeur en entier. Il est souvent utilisé pour convertir des valeurs stockées sous forme de chaînes de caractères en entiers ($toDouble: Convertit une valeur en double.
	$toString: Convertit une valeur en chaîne de caractères, $toDate: Convertit une valeur en date, $toBool: Convertit une valeur en booléen).

$project: Opérateur permettant de projeter certains champs des documents tout en excluant les autres. Il est utilisé pour contrôler les champs inclus dans les résultats de la requête.

$unwind: Opérateur permettant de décomposer les tableaux dans les documents en autant de documents distincts. Il est utilisé lorsque vous avez des données de type tableau et que vous voulez les traiter comme des documents individuels.

$first: Opérateur permettant de renvoyer la première valeur d'un groupe. Il est souvent utilisé en conjonction avec $group pour récupérer la première valeur dans chaque groupe.

$limit: Opérateur permettant de limiter le nombre de documents renvoyés par une opération. Il peut être utilisé pour limiter la taille des résultats d'une requête.

$sort: Opérateur permettant de trier les documents selon les critères spécifiés. Il peut être utilisé pour trier les résultats dans un ordre spécifique.

$add: Opérateur permettant d'ajouter des valeurs numériques ou des dates. Il peut être utilisé pour effectuer des opérations d'addition sur les champs numériques ou pour ajouter des intervalles de temps aux dates. D'autres opérateurs de cette famille incluent $subtract, $multiply, $divide, $mod.
========================================================================
-se connecter avec les information d'authentification par default
=> mongosh
=========================================================================
+aggregate():
*exemple 1 : renvoyer la somme des idcli (supérieur ou égal à 2) par prenom (Rq : pour les clients n'ayant pas de champ prenom, ils ne sont pas affichés):
db.client.aggregate(
	{$match:{idcli:{$gte:2}}},
	{$group:{_id:"$prenom", sommeidcli: { $sum: "$idcli"}}}
);


*ex: renvoyer le nombre de commandes par nom et prenom; Rq : le champ 'commandes' DOIT exister pour pouvoir appeler la somme sur sa taille
voir l'exemple en annexe pour explorer l'opérateur $size avant de voir cet exemple; 
db.client.aggregate(
	{$match: {commandes: {$exists:true}}},
	{$group:{_id:{lenom:"$nom",leprenom:"$prenom"}, nbcommandes: { $sum: {$size: "$commandes"}}}}
);


=> exemple annexe; objectif: Renvoyer l'idcli et le nombre de commandes pour chaque client; Rq : le champ 'commandes' DOIT exister 
db.client.aggregate(
	{$match: {commandes:{$exists:true}}},
	{$project:{_id:0, idcli:1, nbCmdes : {$size:"$commandes"}}}
);



*ex 2: renvoyer la somme de qte des PREMIERES commandes par prenom de client (Rq: pour les clients n'ayant pas de champ commandes, 0 est renvoyé)
	l4 = db.client.aggregate([
  {
    $match: {}
  },
  {
    $project: {
      prenom: 1,
      qtePremiereCommande: {
        $toInt: { $arrayElemAt: ["$commandes.qte", 0] }
      }
    }
  },
  {
    $group: {
      _id: "$prenom",
      sommeQtePremiereCommande: { $sum: "$qtePremiereCommande" }
    }
  }
]);
printjson(l4.toArray());


*ex 3: comme 'ex 2'; Cependant, on garde seulement les clients ayant le champ 'commandes' avec une commande au moins
l5 = db.client.aggregate([
  {
    $match: { "commandes": { $exists: true, $not: { $size: 0 } } }
  },
  {
    $project: {
      prenom: 1,
      qtePremiereCommande: {
        $toInt: { $arrayElemAt: ["$commandes.qte", 0] }
      }
    }
  },
  {
    $group: {
      _id: "$prenom",
      sommeQtePremiereCommande: { $sum: "$qtePremiereCommande" }
    }
  }
]);
printjson(l5.toArray());


*ex 4: on renvoie la somme des qte de toutes les commandes par prenom; Rq : utilisation de l'opérateur '$unwind'
db.client.aggregate([
  {
    $match: { "commandes": { $exists: true, $not: { $size: 0 } } }
  },
  {
    $unwind: "$commandes"
  },
  {
    $group: {
      _id: "$prenom",
      sommeQte: { $sum: { $toInt: "$commandes.qte" } }
    }
  }
]);

=>{ $unwind: "$commandes" } ; permet de diviser le tableau de façon à avoir un document par élément du tableau commandes; les autres champs sont dupliqués


*ex 5: renvoyer les 2 premiers groupes; Rq: utilisation de l'opérateur '$first' (contrepartie:$last), $limit
l6 = db.client.aggregate(
	{$group:{_id:"$prenom", premieridcli: { $first: "$idcli"}}},
	{$limit : 2}
);
print(l6);

*ex 6: renvoyer les documents triés; Rq: utilisation $sort, on renvoie les documents qui ne possèdent pas de champ 'nom' en premier lieu
db.client.aggregate(
	{$sort:{nom:1}},
);

*ex 7: renvoyer une somme, une addition, une multiplication, une division et un modulo
db.client.aggregate([
	{
	$project:
		{
		_id : 0,
		idcli :1,
		addition_idcli:{$add:["$idcli",2]}, 
		soustraction_idcli:{$subtract:["$idcli",2]}, 
		multiplication_idcli:{$multiply:["$idcli",2]}, 
		division_idcli:{$divide:["$idcli",2]}, 
		modulo_idcli:{$mod:["$idcli",2]}
	  }
    }
]);


-exprimer des jointures, ex : associer chaque stagiaire à sa filière
use bdformation
stagiaire = db.createCollection("stagiaire")
filiere = db.createCollection("filiere")
db.stagiaire.insert_many([
        {"cne":"100000","nom":"karimi","prenom":"farid","filiere":1},
        {"cne":"100001","nom":"sadiki","prenom":"farid","filiere":2},
        {"cne":"100002","nom":"karimi","prenom":"halima","filiere":1},
        {"cne":"100003","nom":"chakiri","prenom":"amina"},
]);
db.filiere.insert_many([
        {"numero":1,"designation":"Développement Digital"},
        {"numero":2,"designation":"Infrastructure Digitale"},
        {"numero":3,"designation":"Gestion des entreprises"},
]);
=> renvoyer les documents stagiaires avec un champ additionnel(obligatoire) nommé 'filiereStagiaire' dont la valeur est le document filiere qui désigne la filière du stagiaire
db.stagiaire.aggregate([
                        {
                        "$match":{"filiere":{"$exists":true}}
                        },
                        {
                        "$lookup":
                                {
                                "from":"filiere",
                                "localField":"filiere",
                                "foreignField":"numero",
                                "as":"filiereStagiaire"
                                }
                        }
        ]);
		
		
 
-supprimer une collection, ex : produit:
db.produit.drop()

-supprimer une DB, ex : junkdb:
db.dropDatabase('junkdb')           


