exercice 1
This commit is contained in:
106
README.md
106
README.md
@@ -2,7 +2,25 @@
|
|||||||
|
|
||||||
## MongoDB
|
## MongoDB
|
||||||
|
|
||||||
MongoDB est une base de données orientée document. Contrairement à une base de données relationnelle classique dans laquelle les données sont organisées d’après un schéma (tables, champs, types de données) et mises en relation les unes avec les autres, on stocke les données dans une base MongoDB dans un document dans le style [JSON](../../cours/json), c’est à dire sous la forme clé:valeur, tableaux, objets et sous-objets.
|
MongoDB est une base de données orientée document. Contrairement à une base de données relationnelle classique dans laquelle les données sont organisées d’après un schéma (tables, champs, types de données) et mises en relation les unes avec les autres, on stocke les données dans une base MongoDB dans un document dans le style JSON, c’est à dire sous la forme clé:valeur, tableaux, objets et sous-objets.
|
||||||
|
|
||||||
|
## BSON
|
||||||
|
|
||||||
|
Le BSON (Binary JSON) est un format de sérialisation binaire utilisé par MongoDB pour stocker et échanger des données. Il est conçu pour représenter des documents de manière efficace en termes d'espace et de temps de traitement. Bien qu'il soit inspiré du format JSON (JavaScript Object Notation), il est optimisé pour des performances accrues et pour prendre en charge des types de données supplémentaires qui ne sont pas nativement pris en charge par JSON.
|
||||||
|
|
||||||
|
**Binaire** et compact : Contrairement à JSON qui est un format textuel, BSON est un format binaire, ce qui le rend plus compact et plus rapide à lire et à écrire pour les machines.
|
||||||
|
|
||||||
|
Types de données supplémentaires : BSON supporte des types de données non pris en charge par JSON, tels que :
|
||||||
|
|
||||||
|
- Dates : Représentées comme des nombres de millisecondes depuis l'époque Unix.
|
||||||
|
- ObjectId : Un identifiant unique utilisé par MongoDB pour les documents.
|
||||||
|
- Entiers 32 bits et 64 bits : Pour représenter les valeurs numériques plus efficacement.
|
||||||
|
- Données binaires : Stockage de données brutes comme des fichiers ou des images.
|
||||||
|
- Boolean, null, arrays, embedded documents : Également pris en charge comme en JSON.
|
||||||
|
|
||||||
|
Optimisé pour MongoDB : BSON est spécifiquement conçu pour être utilisé avec MongoDB. Il permet un accès rapide aux documents et aux champs dans une base de données, tout en minimisant la taille des documents lorsqu'ils sont stockés ou transférés sur le réseau.
|
||||||
|
|
||||||
|
Hiérarchique : Tout comme JSON, BSON permet de stocker des documents hiérarchiques, avec des documents imbriqués (documents dans des documents).
|
||||||
|
|
||||||
## Wire Protocol
|
## Wire Protocol
|
||||||
|
|
||||||
@@ -24,32 +42,21 @@ Connexions locales ou distantes : Vous pouvez l'utiliser pour vous connecter à
|
|||||||
|
|
||||||
Télécharger mongosh : https://www.mongodb.com/try/download/shell
|
Télécharger mongosh : https://www.mongodb.com/try/download/shell
|
||||||
|
|
||||||
```bash
|
```shell
|
||||||
mongosh "mongodb://admin:supermotdepasse@127.0.0.1:27017"
|
mongosh "mongodb://admin:!ChangeMe!@127.0.0.1:27017"
|
||||||
|
|
||||||
test>
|
test>
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Ou en utilisant celui présent dans le conteneur
|
||||||
|
|
||||||
|
```shell
|
||||||
|
docker exec -it nosql-document-mongodb-1 mongosh --username admin
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
Par défaut vous vous trouvez sur la base de données test
|
Par défaut vous vous trouvez sur la base de données test
|
||||||
|
|
||||||
## BSON
|
|
||||||
|
|
||||||
Le BSON (Binary JSON) est un format de sérialisation binaire utilisé par MongoDB pour stocker et échanger des données. Il est conçu pour représenter des documents de manière efficace en termes d'espace et de temps de traitement. Bien qu'il soit inspiré du format JSON (JavaScript Object Notation), il est optimisé pour des performances accrues et pour prendre en charge des types de données supplémentaires qui ne sont pas nativement pris en charge par JSON.
|
|
||||||
|
|
||||||
**Binaire** et compact : Contrairement à JSON qui est un format textuel, BSON est un format binaire, ce qui le rend plus compact et plus rapide à lire et à écrire pour les machines.
|
|
||||||
|
|
||||||
Types de données supplémentaires : BSON supporte des types de données non pris en charge par JSON, tels que :
|
|
||||||
|
|
||||||
- Dates : Représentées comme des nombres de millisecondes depuis l'époque Unix.
|
|
||||||
- ObjectId : Un identifiant unique utilisé par MongoDB pour les documents.
|
|
||||||
- Entiers 32 bits et 64 bits : Pour représenter les valeurs numériques plus efficacement.
|
|
||||||
- Données binaires : Stockage de données brutes comme des fichiers ou des images.
|
|
||||||
- Boolean, null, arrays, embedded documents : Également pris en charge comme en JSON.
|
|
||||||
|
|
||||||
Optimisé pour MongoDB : BSON est spécifiquement conçu pour être utilisé avec MongoDB. Il permet un accès rapide aux documents et aux champs dans une base de données, tout en minimisant la taille des documents lorsqu'ils sont stockés ou transférés sur le réseau.
|
|
||||||
|
|
||||||
Hiérarchique : Tout comme JSON, BSON permet de stocker des documents hiérarchiques, avec des documents imbriqués (documents dans des documents).
|
|
||||||
|
|
||||||
## Commandes
|
## Commandes
|
||||||
|
|
||||||
### Créer une base de données
|
### Créer une base de données
|
||||||
@@ -57,7 +64,7 @@ Hiérarchique : Tout comme JSON, BSON permet de stocker des documents hiérarchi
|
|||||||
La commande `use` permet de sélectionner une base de données MongoDB déjà existante ou de créer une base de données si elle n'existe pas.
|
La commande `use` permet de sélectionner une base de données MongoDB déjà existante ou de créer une base de données si elle n'existe pas.
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
use mabasededonnees
|
use iut
|
||||||
```
|
```
|
||||||
|
|
||||||
La commande db affiche quelle base de données est sélectionnée.
|
La commande db affiche quelle base de données est sélectionnée.
|
||||||
@@ -84,8 +91,8 @@ La commande create compte deux paramètres. Tout d’abord, le paramètre name (
|
|||||||
|
|
||||||
Dans les options, vous pouvez définir par exemple si les documents d’une collection doivent posséder une taille précise (capped: true) ou s’ils doivent avoir une quantité restreinte de Bytes (size: <number>) ou encore une quantité limitée de documents (max: <number>). Une collection nommée macollection, une limitation à 6.142.800 Bytes et un maximum de 10 000 documents seraient définis à titre d’exemple avec la commande suivante :
|
Dans les options, vous pouvez définir par exemple si les documents d’une collection doivent posséder une taille précise (capped: true) ou s’ils doivent avoir une quantité restreinte de Bytes (size: <number>) ou encore une quantité limitée de documents (max: <number>). Une collection nommée macollection, une limitation à 6.142.800 Bytes et un maximum de 10 000 documents seraient définis à titre d’exemple avec la commande suivante :
|
||||||
|
|
||||||
```
|
```javascript
|
||||||
db.createCollection ("macollection", { capped: true,
|
db.createCollection ("clients", { capped: true,
|
||||||
size: 6142800,
|
size: 6142800,
|
||||||
max: 10000
|
max: 10000
|
||||||
} )
|
} )
|
||||||
@@ -98,7 +105,7 @@ Après création du dossier, vous pouvez y insérer des documents. Trois méthod
|
|||||||
Les commandes vous permettent d’insérer un seul document (.insertOne), plusieurs documents (.insertMany) ou un ou plusieurs documents (.insert). L’exemple suivant permet un simple ajout dans la base de données qui regroupe trois informations (nom, âge, sexe) et s’effectue dans le dossier macollection de l’étape 5 :
|
Les commandes vous permettent d’insérer un seul document (.insertOne), plusieurs documents (.insertMany) ou un ou plusieurs documents (.insert). L’exemple suivant permet un simple ajout dans la base de données qui regroupe trois informations (nom, âge, sexe) et s’effectue dans le dossier macollection de l’étape 5 :
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
db.macollection.insertOne(
|
db.clients.insertOne(
|
||||||
{
|
{
|
||||||
Nom: "Albert",
|
Nom: "Albert",
|
||||||
Age: 28,
|
Age: 28,
|
||||||
@@ -107,7 +114,7 @@ db.macollection.insertOne(
|
|||||||
)
|
)
|
||||||
```
|
```
|
||||||
|
|
||||||
MongoDB crée automatiquement une collection avec un identifiant unique. Cet identifiant est strictement incremental.
|
MongoDB crée automatiquement une collection avec un identifiant unique _id. Cet identifiant est strictement incremental.
|
||||||
|
|
||||||
### Recherche
|
### Recherche
|
||||||
|
|
||||||
@@ -116,7 +123,7 @@ La recherche s'effectue avec la commande find. Le paramètre optionnel query fil
|
|||||||
La commande findOne() retourne un seul document qui correspond à la requête. Si plusieurs documents correspondent, MongoDB renverra le premier trouvé en fonction de l'ordre d'insertion.
|
La commande findOne() retourne un seul document qui correspond à la requête. Si plusieurs documents correspondent, MongoDB renverra le premier trouvé en fonction de l'ordre d'insertion.
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
db.macollection.find( { Nom: "Name", Age: 28 } )
|
db.clients.find( { Nom: "Albert", Age: 28 } )
|
||||||
```
|
```
|
||||||
|
|
||||||
### Pipline d'aggrégation
|
### Pipline d'aggrégation
|
||||||
@@ -135,21 +142,21 @@ db.collection.aggregate([
|
|||||||
])
|
])
|
||||||
```
|
```
|
||||||
|
|
||||||
$match : Filtre les documents selon des critères (équivalent de find()).
|
**$match** : Filtre les documents selon des critères (équivalent de find()).
|
||||||
|
|
||||||
$group : Regroupe les documents par clé(s) et effectue des calculs agrégés sur chaque groupe.
|
**$group** : Regroupe les documents par clé(s) et effectue des calculs agrégés sur chaque groupe.
|
||||||
|
|
||||||
$project : Restructure les documents, en choisissant quels champs inclure/exclure, ou en créant de nouveaux champs.
|
**$project** : Restructure les documents, en choisissant quels champs inclure/exclure, ou en créant de nouveaux champs.
|
||||||
|
|
||||||
$sort : Trie les documents selon un ou plusieurs critères.
|
**$sort** : Trie les documents selon un ou plusieurs critères.
|
||||||
|
|
||||||
$limit : Limite le nombre de documents renvoyés.
|
**$limit** : Limite le nombre de documents renvoyés.
|
||||||
|
|
||||||
$skip : Ignore un nombre défini de documents avant de renvoyer le reste.
|
**$skip** : Ignore un nombre défini de documents avant de renvoyer le reste.
|
||||||
|
|
||||||
$lookup : Effectue des jointures entre collections.
|
**$lookup** : Effectue des jointures entre collections.
|
||||||
|
|
||||||
$unwind : Décompose un tableau en plusieurs documents, un pour chaque élément du tableau.
|
**$unwind** : Décompose un tableau en plusieurs documents, un pour chaque élément du tableau.
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
db.sales.aggregate([
|
db.sales.aggregate([
|
||||||
@@ -179,12 +186,26 @@ db.sales.aggregate([
|
|||||||
])
|
])
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Noter les opérateurs qui sont des fonctions $gte, $sum, $multiply, ...
|
||||||
|
|
||||||
|
### Opérateurs
|
||||||
|
|
||||||
|
$eq = equal
|
||||||
|
$gt > greater than
|
||||||
|
$gte >=
|
||||||
|
$in
|
||||||
|
$lt <
|
||||||
|
$lte <=
|
||||||
|
$ne <>
|
||||||
|
$nin
|
||||||
|
|
||||||
|
|
||||||
### Modification
|
### Modification
|
||||||
|
|
||||||
Si vous souhaitez actualiser ce document, vous aurez recours à la fonction update. Celle-ci permet de définir les valeurs à changer. Choisissez un update operator (commande de mises à jour) et saisissez la nouvelle valeur à modifier. Si vous souhaitez par exemple changer le champ « âge », vous aurez recours à l’opérateur $set :
|
Si vous souhaitez actualiser ce document, vous aurez recours à la fonction update. Celle-ci permet de définir les valeurs à changer. Choisissez un update operator (commande de mises à jour) et saisissez la nouvelle valeur à modifier. Si vous souhaitez par exemple changer le champ « âge », vous aurez recours à l’opérateur $set :
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
db.macollection.update(
|
db.clients.update(
|
||||||
{ Age: 28 },
|
{ Age: 28 },
|
||||||
{
|
{
|
||||||
$set: { Age: 30 }
|
$set: { Age: 30 }
|
||||||
@@ -197,17 +218,22 @@ db.macollection.update(
|
|||||||
Pour supprimer les documents d’une collection, utilisez la commande remove :
|
Pour supprimer les documents d’une collection, utilisez la commande remove :
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
db.macollection.remove();
|
db.clients.remove();
|
||||||
```
|
```
|
||||||
|
|
||||||
Il est également possible de supprimer un seul document de la collection, en sélectionnant des critères comme l’ID ou en définissant des valeurs précises afin de signaler à MongoDB de quels éléments il s’agit dans la base de données. Plus vous serez précis, plus le système de base de données sera spécifique au cours du processus de suppression.
|
Il est également possible de supprimer un seul document de la collection, en sélectionnant des critères comme l’ID ou en définissant des valeurs précises afin de signaler à MongoDB de quels éléments il s’agit dans la base de données. Plus vous serez précis, plus le système de base de données sera spécifique au cours du processus de suppression.
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
db.macollection.remove( { Age: 28 } )
|
db.clients.remove( { Age: 28 } )
|
||||||
```
|
```
|
||||||
|
|
||||||
La commande supprimera toutes les saisies dont le champ « âge » a une valeur égale à 28. Vous pouvez aussi définir la suppression du premier élément concerné avec le paramètre justOne-Parameter (1) :
|
La commande supprimera toutes les saisies dont le champ « âge » a une valeur égale à 28. Vous pouvez aussi définir la suppression du premier élément concerné avec le paramètre justOne (1) :
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
db.macollection.remove( { Age: 28 }, 1);
|
db.clients.remove( { Age: 28 }, 1);
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Jeu de données
|
||||||
|
|
||||||
|
- https://raw.githubusercontent.com/mongodb/docs-assets/geospatial/neighborhoods.json
|
||||||
|
- https://raw.githubusercontent.com/mongodb/docs-assets/geospatial/restaurants.json
|
||||||
|
|||||||
2
Reponses.md
Normal file
2
Reponses.md
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
curl -X GET \
|
||||||
|
"https://datasets-server.huggingface.co/rows?dataset=MongoDB%2Fwhatscooking.restaurants&config=default&split=train&offset=0&length=100"
|
||||||
244
exercice.md
244
exercice.md
@@ -1,245 +1,21 @@
|
|||||||
---
|
|
||||||
title: MongoDB
|
|
||||||
---
|
|
||||||
|
|
||||||
## Serveur avec Docker
|
|
||||||
|
|
||||||
```yaml
|
1. le document dont la référence est 51943385-B
|
||||||
mongodb:
|
|
||||||
container_name: r5a10-mongodb
|
|
||||||
image: mongo:${MONGODB_VERSION:-7.0.7-jammy}
|
|
||||||
volumes:
|
|
||||||
- ./data/configdb:/data/configdb
|
|
||||||
- mongodb:/data/db
|
|
||||||
ports:
|
|
||||||
- ${MONGODB_PORT:-27017}:27017
|
|
||||||
environment:
|
|
||||||
MONGO_INITDB_ROOT_USERNAME: ${MONGO_INITDB_ROOT_USERNAME:-admin}
|
|
||||||
MONGO_INITDB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Jeu de données
|
2. Extraire la liste des "status" distincts.
|
||||||
|
|
||||||
Téléchargez les exemples de jeux de données depuis
|
3. Récupérer les documents dont au moins un item de commande a la référence "C23401U10MD"
|
||||||
- https://raw.githubusercontent.com/mongodb/docs-assets/geospatial/neighborhoods.json
|
|
||||||
- https://raw.githubusercontent.com/mongodb/docs-assets/geospatial/restaurants.json
|
|
||||||
|
|
||||||
## Requêtes simples
|
4. Calculer le total des productAmount
|
||||||
|
|
||||||
### Q1 Afficher le premier document de la collection restaurant.
|
5. Les document dont le champ postalCode de shippingAddress commence par 23
|
||||||
|
|
||||||
```javascript
|
6. Extraire la liste des carrier et trackingNumber du champ shipment
|
||||||
db.restaurants.findOne();
|
|
||||||
```
|
|
||||||
|
|
||||||
### Q2 Afficher tous les documents de la collection restaurants.
|
7. Calculer le total des productAmount dont la méthode de paiement est CB
|
||||||
|
|
||||||
```javascript
|
8. Compter le nombre de documents qui utilise PAYPAL comme paiement
|
||||||
db.restaurants.find();
|
|
||||||
```
|
|
||||||
|
|
||||||
### Q3 Afficher les champs restaurant_id, nom, arrondissement et cuisine pour tous les documents de la collection restaurant
|
9. Trouver les document dont latestShipDate est avant le 20/10/2025
|
||||||
|
|
||||||
```javascript
|
10. Trouver le nombre total de commandes par statut et méthode de paiement.
|
||||||
db.restaurants.find({},{restaurant_id:1, name:1, borough:1, cuisine:1});
|
|
||||||
```
|
|
||||||
|
|
||||||
### Q4 Afficher les 5 premiers documents de la collection restaurants. Utiliser la projection de Q3
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
db.restaurants.find({},{restaurant_id:1, name:1, borough:1, cuisine:1})().limit(5);
|
|
||||||
```
|
|
||||||
|
|
||||||
### Q5 Afficher la liste des boroughs
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
db.restaurants.distinct("borough")
|
|
||||||
```
|
|
||||||
|
|
||||||
```
|
|
||||||
Bronx
|
|
||||||
Brooklyn
|
|
||||||
Manhattan
|
|
||||||
Missing
|
|
||||||
Queens
|
|
||||||
Staten Island
|
|
||||||
```
|
|
||||||
|
|
||||||
### Q6 Quel est le nombre de cuisine différentes dans le Bronx ? à Manhattan ?
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
db.restaurants.distinct("cuisine", { borough: "Manhattan"}).length
|
|
||||||
```
|
|
||||||
|
|
||||||
### Q7 Afficher les champs restaurant_id, nom, arrondissement et cuisine, mais exclure le champ _id, pour les restaurants servant de la cuisine française.
|
|
||||||
```javascript
|
|
||||||
db.restaurants.find(cuisine: "French"},{restaurant_id:1,name:1,borough:1,cuisine:1,_id:0})
|
|
||||||
```
|
|
||||||
### Q8 Afficher les champs restaurant_id, nom, arrondissement et code postal, mais exclure le champ id pour les restaurant servant des Pizzas.
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
db.restaurants.find({},{restaurant_id:1,name:1,borough:1,"address.zipcode":1,_id:0})
|
|
||||||
```
|
|
||||||
|
|
||||||
### Q9 Afficher tous les restaurants qui se trouvent dans l'arrondissement de Brooklyn.
|
|
||||||
```javascript
|
|
||||||
db.restaurants.find({borough:"Brooklyn"})
|
|
||||||
```
|
|
||||||
|
|
||||||
### Q10 Afficher les 5 premiers restaurants de l'arrondissement Bronx
|
|
||||||
```javascript
|
|
||||||
db.restaurants.find({borough:"Bronx"}).limit(5)
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
### Q11 afficher les 5 prochains restaurants après avoir sauté les 5 premiers dans l'arrondissement du Bronx.
|
|
||||||
```javascript
|
|
||||||
db.restaurants.find({borough:"Bronx"}).skip(5).limit(5)
|
|
||||||
```
|
|
||||||
|
|
||||||
### Q12 Retrouvez les restaurants qui ont obtenu une note supérieure à 90.
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
db.restaurants.find({"grades.score":{$gt:90}})
|
|
||||||
```
|
|
||||||
|
|
||||||
### Q13 Retrouvez les restaurants qui ont obtenu une note supérieure à 80 mais inférieure à 100.
|
|
||||||
```javascript
|
|
||||||
db.restaurants.find({$and:[{"grades.score":{gt:90}},{"grades.score":{lt:100}}]})
|
|
||||||
```
|
|
||||||
|
|
||||||
### Q14 Retrouver les restaurants qui se situent à une latitude inférieure à -95.75
|
|
||||||
```javascript
|
|
||||||
db.restaurants.find({"address.coord.coordinates.0":{$lt:-95.75}})
|
|
||||||
```
|
|
||||||
|
|
||||||
### Q15 trouvez les restaurants qui ne préparent aucune cuisine « américaine » et dont la note est supérieure à 70 et leur latitude inférieure à -65,754168.
|
|
||||||
|
|
||||||
### Q16 trouvez les restaurants qui ne préparent aucune cuisine « américaine » et qui ont obtenu un score supérieur à 70 et sont situés dans une longitude inférieure à -65,754168. (Remarque : effectuez cette requête sans utiliser l'opérateur $and )
|
|
||||||
|
|
||||||
### Q17 trouvez les restaurants qui ne préparent aucune cuisine « américaine » et qui ont obtenu un score « A » n'appartenant pas à l'arrondissement de Brooklyn. Le document doit être affiché selon la cuisine par ordre décroissant.
|
|
||||||
|
|
||||||
### Q18 trouvez l'identifiant du restaurant, le nom, le quartier et la cuisine des restaurants qui contiennent « Wil » comme les trois premières lettres de leur nom.
|
|
||||||
|
|
||||||
### Q19 Trouvez l'identifiant du restaurant, le nom, l'arrondissement et la cuisine des restaurants qui contiennent « ces » comme les trois dernières lettres de leur nom.
|
|
||||||
|
|
||||||
### Q20 recherchez l'identifiant du restaurant, le nom, l'arrondissement et la cuisine des restaurants qui contiennent « Reg » comme trois lettres quelque part dans leur nom.
|
|
||||||
|
|
||||||
### Q21 Trouver les restaurants qui appartiennent à l'arrondissement de Staten Island et préparent des plats américains ou chinois.
|
|
||||||
|
|
||||||
### Q22 recherchez l'identifiant du restaurant, le nom, le quartier et la cuisine des restaurants qui ont obtenu un score ne dépassant pas 10.
|
|
||||||
|
|
||||||
### Q23 recherchez l'identifiant du restaurant, le nom, le quartier et la cuisine des restaurants qui ont préparé des plats sauf « Américain » et « Chinois » ou le nom du restaurant commence par la lettre « Wil ».
|
|
||||||
|
|
||||||
### Q24 recherchez l'identifiant, le nom et les notes du restaurant qui ont obtenu la note « A » et obtenu un score de 11 à une date ISO » 2014-08-11T00:00:00Z » parmi de nombreuses dates d'enquête.
|
|
||||||
|
|
||||||
### Q25 organisez le nom des restaurants par ordre croissant avec toutes les colonnes.
|
|
||||||
|
|
||||||
### Q26 organisez le nom des restaurants par ordre décroissant avec toutes les colonnes.
|
|
||||||
|
|
||||||
### Q27 classez le nom de la cuisine par ordre croissant et pour cette même cuisine, le arrondissement doit être par ordre décroissant.
|
|
||||||
|
|
||||||
### Q28 savoir si toutes les adresses contiennent la rue ou non.
|
|
||||||
|
|
||||||
### Q29 sélectionnez tous les documents de la collection du restaurant dont la valeur du champ de coordonnées est Double.
|
|
||||||
|
|
||||||
### Q30 Écrivez une requête MongoDB qui sélectionnera l'identifiant du restaurant, le nom et les notes des restaurants qui ont un score multiple de 7.
|
|
||||||
|
|
||||||
## Trouver des restaurants avec des requêtes géospatiales
|
|
||||||
|
|
||||||
L'indexation géospatiale de MongoDB vous permet d'exécuter efficacement des requêtes spatiales sur une collection contenant des formes et des points géospatiaux. Pour présenter les capacités des fonctionnalités géospatiales et comparer différentes approches, ce didacticiel vous guidera tout au long du processus d'écriture de requêtes pour une application géospatiale simple.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Ceux-ci contiennent respectivement les collections restaurantset neighborhoods.
|
|
||||||
|
|
||||||
Un index géospatial améliore presque toujours les performances des fonctions _$geoWithinrequêtes_ et _$geoIntersects_.
|
|
||||||
|
|
||||||
|
|
||||||
Changer de base de données
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
use sample_restaurants
|
|
||||||
```
|
|
||||||
|
|
||||||
Lister les collections de la base de données
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
show collections
|
|
||||||
```
|
|
||||||
|
|
||||||
## Exercice
|
|
||||||
|
|
||||||
#### Exploration des données
|
|
||||||
|
|
||||||
restaurants
|
|
||||||
|
|
||||||
Inspecter une entrée dans la collection restaurants :
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
db.restaurants.findOne()
|
|
||||||
```
|
|
||||||
|
|
||||||
Inspectez maintenant une entrée dans la collection neighborhoods :
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
db.neighborhoods.findOne()
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Création des index spatiaux
|
|
||||||
|
|
||||||
Parce que ces données sont géographiques, créez un 2dsphereindex sur chaque collection en utilisant mongosh:
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
db.restaurants.createIndex({ coord: "2dsphere" })
|
|
||||||
db.neighborhoods.createIndex({ geometry: "2dsphere" })
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Trouver le quartier actuel
|
|
||||||
|
|
||||||
En supposant que l'appareil mobile de l'utilisateur puisse donner une localisation raisonnablement précise pour l'utilisateur, il est simple de trouver le quartier actuel de l'utilisateur avec $geoIntersects.
|
|
||||||
|
|
||||||
Supposons que l'utilisateur se trouve à -73,93414657 de longitude et 40,82302903 de latitude. Pour trouver le voisinage actuel, vous devez spécifier un point à l'aide du $geometrychamp spécial au format GeoJSON :
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
db.neighborhoods.findOne({ geometry: { $geoIntersects: { $geometry: { type: "Point", coordinates: [ -73.93, 40.82 ] } } } })
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Trouver tous les restaurants du quartier
|
|
||||||
|
|
||||||
Vous pouvez également effectuer une requête pour trouver tous les restaurants contenus dans un quartier donné. Exécutez la commande suivante pour trouver le quartier contenant l'utilisateur, puis comptez les restaurants dans ce quartier :
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
var neighborhood = db.neighborhoods.findOne( { geometry: { $geoIntersects: { $geometry: { type: "Point", coordinates: [ -73.93414657, 40.82302903 ] } } } } )
|
|
||||||
|
|
||||||
db.restaurants.find( { _coordonnees_: { $geoWithin: { $geometry: neighborhood.geometry } } } ).count()
|
|
||||||
```
|
|
||||||
|
|
||||||
Trouver des restaurants à proximité
|
|
||||||
|
|
||||||
Pour trouver des restaurants à une distance spécifiée d'un point, vous pouvez utiliser soit $geoWithin avec $centerSphere pour renvoyer les résultats dans un ordre non trié, soit $nearSphere avec $maxDistance si vous avez besoin de résultats triés par distance.
|
|
||||||
|
|
||||||
Non trié avec $geoWithin
|
|
||||||
|
|
||||||
Pour trouver des restaurants dans une région circulaire, utilisez $geoWithinwith $centerSphere. $centerSphereest une syntaxe spécifique à MongoDB pour désigner une région circulaire en spécifiant le centre et le rayon en radians.
|
|
||||||
|
|
||||||
$geoWithinne renvoie pas les documents dans un ordre spécifique, il peut donc montrer à l'utilisateur les documents les plus éloignés en premier.
|
|
||||||
|
|
||||||
Les éléments suivants trouveront tous les restaurants dans un rayon de cinq miles de l'utilisateur :
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
db.restaurants.find({ location:
|
|
||||||
{ $geoWithin:
|
|
||||||
{ $centerSphere: [ [ -73.93414657, 40.82302903 ], 5 / 3963.2 ] } } })
|
|
||||||
```
|
|
||||||
|
|
||||||
$centerSphereLe deuxième argument de accepte le rayon en radians, vous devez donc le diviser par le rayon de la Terre en miles. Pour plus d'informations sur la conversion entre les unités de distance, consultez Convertir la distance en radians pour les opérateurs sphériques .
|
|
||||||
|
|
||||||
Trié avec $nearSphere
|
|
||||||
|
|
||||||
Vous pouvez également utiliser $nearSphereet spécifier un $maxDistanceterme en mètres. Cela renverra tous les restaurants situés à moins de cinq miles de l'utilisateur, triés du plus proche au plus éloigné :
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
var METERS_PER_MILE = 1609.34
|
|
||||||
db.restaurants.find({ location: { $nearSphere: { $geometry: { type: "Point", coordinates: [ -73.93414657, 40.82302903 ] }, $maxDistance: 5 * METERS_PER_MILE } } })
|
|
||||||
```
|
|
||||||
|
|||||||
239
exercice2.md
Normal file
239
exercice2.md
Normal file
@@ -0,0 +1,239 @@
|
|||||||
|
---
|
||||||
|
title: MongoDB
|
||||||
|
---
|
||||||
|
|
||||||
|
## Serveur avec Docker
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
mongodb:
|
||||||
|
container_name: r5a10-mongodb
|
||||||
|
image: mongo:${MONGODB_VERSION:-7.0.7-jammy}
|
||||||
|
volumes:
|
||||||
|
- ./data/configdb:/data/configdb
|
||||||
|
- mongodb:/data/db
|
||||||
|
ports:
|
||||||
|
- ${MONGODB_PORT:-27017}:27017
|
||||||
|
environment:
|
||||||
|
MONGO_INITDB_ROOT_USERNAME: ${MONGO_INITDB_ROOT_USERNAME:-admin}
|
||||||
|
MONGO_INITDB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Requêtes simples
|
||||||
|
|
||||||
|
### Q1 Afficher le premier document de la collection restaurant.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
db.restaurants.findOne();
|
||||||
|
```
|
||||||
|
|
||||||
|
### Q2 Afficher tous les documents de la collection restaurants.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
db.restaurants.find();
|
||||||
|
```
|
||||||
|
|
||||||
|
### Q3 Afficher les champs restaurant_id, nom, arrondissement et cuisine pour tous les documents de la collection restaurant
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
db.restaurants.find({},{restaurant_id:1, name:1, borough:1, cuisine:1});
|
||||||
|
```
|
||||||
|
|
||||||
|
### Q4 Afficher les 5 premiers documents de la collection restaurants. Utiliser la projection de Q3
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
db.restaurants.find({},{restaurant_id:1, name:1, borough:1, cuisine:1})().limit(5);
|
||||||
|
```
|
||||||
|
|
||||||
|
### Q5 Afficher la liste des boroughs
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
db.restaurants.distinct("borough")
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
Bronx
|
||||||
|
Brooklyn
|
||||||
|
Manhattan
|
||||||
|
Missing
|
||||||
|
Queens
|
||||||
|
Staten Island
|
||||||
|
```
|
||||||
|
|
||||||
|
### Q6 Quel est le nombre de cuisine différentes dans le Bronx ? à Manhattan ?
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
db.restaurants.distinct("cuisine", { borough: "Manhattan"}).length
|
||||||
|
```
|
||||||
|
|
||||||
|
### Q7 Afficher les champs restaurant_id, nom, arrondissement et cuisine, mais exclure le champ _id, pour les restaurants servant de la cuisine française.
|
||||||
|
```javascript
|
||||||
|
db.restaurants.find(cuisine: "French"},{restaurant_id:1,name:1,borough:1,cuisine:1,_id:0})
|
||||||
|
```
|
||||||
|
### Q8 Afficher les champs restaurant_id, nom, arrondissement et code postal, mais exclure le champ id pour les restaurant servanTéléchargez les exemples de jeux de données depuist des Pizzas.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
db.restaurants.find({},{restaurant_id:1,name:1,borough:1,"address.zipcode":1,_id:0})
|
||||||
|
```
|
||||||
|
|
||||||
|
### Q9 Afficher tous les restaurants qui se trouvent dans l'arrondissement de Brooklyn.
|
||||||
|
```javascript
|
||||||
|
db.restaurants.find({borough:"Brooklyn"})
|
||||||
|
```
|
||||||
|
|
||||||
|
### Q10 Afficher les 5 premiers restaurants de l'arrondissement Bronx
|
||||||
|
```javascript
|
||||||
|
db.restaurants.find({borough:"Bronx"}).limit(5)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### Q11 afficher les 5 prochains restaurants après avoir sauté les 5 premiers dans l'arrondissement du Bronx.
|
||||||
|
```javascript
|
||||||
|
db.restaurants.find({borough:"Bronx"}).skip(5).limit(5)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Q12 Retrouvez les restaurants qui ont obtenu une note supérieure à 90.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
db.restaurants.find({"grades.score":{$gt:90}})
|
||||||
|
```
|
||||||
|
|
||||||
|
### Q13 Retrouvez les restaurants qui ont obtenu une note supérieure à 80 mais inférieure à 100.
|
||||||
|
```javascript
|
||||||
|
db.restaurants.find({$and:[{"grades.score":{gt:90}},{"grades.score":{lt:100}}]})
|
||||||
|
```
|
||||||
|
|
||||||
|
### Q14 Retrouver les restaurants qui se situent à une latitude inférieure à -95.75
|
||||||
|
```javascript
|
||||||
|
db.restaurants.find({"address.coord.coordinates.0":{$lt:-95.75}})
|
||||||
|
```
|
||||||
|
|
||||||
|
### Q15 trouvez les restaurants qui ne préparent aucune cuisine « américaine » et dont la note est supérieure à 70 et leur latitude inférieure à -65,754168.
|
||||||
|
|
||||||
|
### Q16 trouvez les restaurants qui ne préparent aucune cuisine « américaine » et qui ont obtenu un score supérieur à 70 et sont situés dans une longitude inférieure à -65,754168. (Remarque : effectuez cette requête sans utiliser l'opérateur $and )
|
||||||
|
|
||||||
|
### Q17 trouvez les restaurants qui ne préparent aucune cuisine « américaine » et qui ont obtenu un score « A » n'appartenant pas à l'arrondissement de Brooklyn. Le document doit être affiché selon la cuisine par ordre décroissant.
|
||||||
|
|
||||||
|
### Q18 trouvez l'identifiant du restaurant, le nom, le quartier et la cuisine des restaurants qui contiennent « Wil » comme les trois premières lettres de leur nom.
|
||||||
|
|
||||||
|
### Q19 Trouvez l'identifiant du restaurant, le nom, l'arrondissement et la cuisine des restaurants qui contiennent « ces » comme les trois dernières lettres de leur nom.
|
||||||
|
|
||||||
|
### Q20 recherchez l'identifiant du restaurant, le nom, l'arrondissement et la cuisine des restaurants qui contiennent « Reg » comme trois lettres quelque part dans leur nom.
|
||||||
|
|
||||||
|
### Q21 Trouver les restaurants qui appartiennent à l'arrondissement de Staten Island et préparent des plats américains ou chinois.
|
||||||
|
|
||||||
|
### Q22 recherchez l'identifiant du restaurant, le nom, le quartier et la cuisine des restaurants qui ont obtenu un score ne dépassant pas 10.
|
||||||
|
|
||||||
|
### Q23 recherchez l'identifiant du restaurant, le nom, le quartier et la cuisine des restaurants qui ont préparé des plats sauf « Américain » et « Chinois » ou le nom du restaurant commence par la lettre « Wil ».
|
||||||
|
|
||||||
|
### Q24 recherchez l'identifiant, le nom et les notes du restaurant qui ont obtenu la note « A » et obtenu un score de 11 à une date ISO » 2014-08-11T00:00:00Z » parmi de nombreuses dates d'enquête.
|
||||||
|
|
||||||
|
### Q25 organisez le nom des restaurants par ordre croissant avec toutes les colonnes.
|
||||||
|
|
||||||
|
### Q26 organisez le nom des restaurants par ordre décroissant avec toutes les colonnes.
|
||||||
|
|
||||||
|
### Q27 classez le nom de la cuisine par ordre croissant et pour cette même cuisine, le arrondissement doit être par ordre décroissant.
|
||||||
|
|
||||||
|
### Q28 savoir si toutes les adresses contiennent la rue ou non.
|
||||||
|
|
||||||
|
### Q29 sélectionnez tous les documents de la collection du restaurant dont la valeur du champ de coordonnées est Double.
|
||||||
|
|
||||||
|
### Q30 Écrivez une requête MongoDB qui sélectionnera l'identifiant du restaurant, le nom et les notes des restaurants qui ont un score multiple de 7.
|
||||||
|
|
||||||
|
## Trouver des restaurants avec des requêtes géospatiales
|
||||||
|
|
||||||
|
L'indexation géospatiale de MongoDB vous permet d'exécuter efficacement des requêtes spatiales sur une collection contenant des formes et des points géospatiaux. Pour présenter les capacités des fonctionnalités géospatiales et comparer différentes approches, ce didacticiel vous guidera tout au long du processus d'écriture de requêtes pour une application géospatiale simple.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Ceux-ci contiennent respectivement les collections restaurantset neighborhoods.
|
||||||
|
|
||||||
|
Un index géospatial améliore presque toujours les performances des fonctions _$geoWithinrequêtes_ et _$geoIntersects_.
|
||||||
|
|
||||||
|
|
||||||
|
Changer de base de données
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
use sample_restaurants
|
||||||
|
```
|
||||||
|
|
||||||
|
Lister les collections de la base de données
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
show collections
|
||||||
|
```
|
||||||
|
|
||||||
|
## Exercice
|
||||||
|
|
||||||
|
#### Exploration des données
|
||||||
|
|
||||||
|
restaurants
|
||||||
|
|
||||||
|
Inspecter une entrée dans la collection restaurants :
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
db.restaurants.findOne()
|
||||||
|
```
|
||||||
|
|
||||||
|
Inspectez maintenant une entrée dans la collection neighborhoods :
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
db.neighborhoods.findOne()
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Création des index spatiaux
|
||||||
|
|
||||||
|
Parce que ces données sont géographiques, créez un 2dsphereindex sur chaque collection en utilisant mongosh:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
db.restaurants.createIndex({ coord: "2dsphere" })
|
||||||
|
db.neighborhoods.createIndex({ geometry: "2dsphere" })
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Trouver le quartier actuel
|
||||||
|
|
||||||
|
En supposant que l'appareil mobile de l'utilisateur puisse donner une localisation raisonnablement précise pour l'utilisateur, il est simple de trouver le quartier actuel de l'utilisateur avec $geoIntersects.
|
||||||
|
|
||||||
|
Supposons que l'utilisateur se trouve à -73,93414657 de longitude et 40,82302903 de latitude. Pour trouver le voisinage actuel, vous devez spécifier un point à l'aide du $geometrychamp spécial au format GeoJSON :
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
db.neighborhoods.findOne({ geometry: { $geoIntersects: { $geometry: { type: "Point", coordinates: [ -73.93, 40.82 ] } } } })
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Trouver tous les restaurants du quartier
|
||||||
|
|
||||||
|
Vous pouvez également effectuer une requête pour trouver tous les restaurants contenus dans un quartier donné. Exécutez la commande suivante pour trouver le quartier contenant l'utilisateur, puis comptez les restaurants dans ce quartier :
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
var neighborhood = db.neighborhoods.findOne( { geometry: { $geoIntersects: { $geometry: { type: "Point", coordinates: [ -73.93414657, 40.82302903 ] } } } } )
|
||||||
|
|
||||||
|
db.restaurants.find( { _coordonnees_: { $geoWithin: { $geometry: neighborhood.geometry } } } ).count()
|
||||||
|
```
|
||||||
|
|
||||||
|
Trouver des restaurants à proximité
|
||||||
|
|
||||||
|
Pour trouver des restaurants à une distance spécifiée d'un point, vous pouvez utiliser soit $geoWithin avec $centerSphere pour renvoyer les résultats dans un ordre non trié, soit $nearSphere avec $maxDistance si vous avez besoin de résultats triés par distance.
|
||||||
|
|
||||||
|
Non trié avec $geoWithin
|
||||||
|
|
||||||
|
Pour trouver des restaurants dans une région circulaire, utilisez $geoWithinwith $centerSphere. $centerSphereest une syntaxe spécifique à MongoDB pour désigner une région circulaire en spécifiant le centre et le rayon en radians.
|
||||||
|
|
||||||
|
$geoWithinne renvoie pas les documents dans un ordre spécifique, il peut donc montrer à l'utilisateur les documents les plus éloignés en premier.
|
||||||
|
|
||||||
|
Les éléments suivants trouveront tous les restaurants dans un rayon de cinq miles de l'utilisateur :
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
db.restaurants.find({ location:
|
||||||
|
{ $geoWithin:
|
||||||
|
{ $centerSphere: [ [ -73.93414657, 40.82302903 ], 5 / 3963.2 ] } } })
|
||||||
|
```
|
||||||
|
|
||||||
|
$centerSphereLe deuxième argument de accepte le rayon en radians, vous devez donc le diviser par le rayon de la Terre en miles. Pour plus d'informations sur la conversion entre les unités de distance, consultez Convertir la distance en radians pour les opérateurs sphériques .
|
||||||
|
|
||||||
|
Trié avec $nearSphere
|
||||||
|
|
||||||
|
Vous pouvez également utiliser $nearSphereet spécifier un $maxDistanceterme en mètres. Cela renverra tous les restaurants situés à moins de cinq miles de l'utilisateur, triés du plus proche au plus éloigné :
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
var METERS_PER_MILE = 1609.34
|
||||||
|
db.restaurants.find({ location: { $nearSphere: { $geometry: { type: "Point", coordinates: [ -73.93414657, 40.82302903 ] }, $maxDistance: 5 * METERS_PER_MILE } } })
|
||||||
|
```
|
||||||
25361
initdb.d/geo.json
Normal file
25361
initdb.d/geo.json
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user