Skip to content
Snippets Groups Projects
Commit 370b0823 authored by Helene Coullon's avatar Helene Coullon
Browse files

import in MongoDB

parent 7a44a85c
No related branches found
No related tags found
No related merge requests found
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
## Initialisation ## Initialisation
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
%load_ext sql %load_ext sql
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
%sql mysql+mysqldb://root:root@some-mysql:3306/world_x %sql mysql+mysqldb://root:root@some-mysql:3306/world_x
``` ```
%% Output %% Output
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
%config SqlMagic.style = '_DEPRECATED_DEFAULT' %config SqlMagic.style = '_DEPRECATED_DEFAULT'
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
## Exploration de la base ## Exploration de la base
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
%%sql %%sql
DESCRIBE countryinfo; DESCRIBE countryinfo;
``` ```
%% Output %% Output
+--------------+---------------+------+-----+---------+-------------------+ +--------------+---------------+------+-----+---------+-------------------+
| Field | Type | Null | Key | Default | Extra | | Field | Type | Null | Key | Default | Extra |
+--------------+---------------+------+-----+---------+-------------------+ +--------------+---------------+------+-----+---------+-------------------+
| doc | json | YES | | None | | | doc | json | YES | | None | |
| _id | varbinary(32) | NO | PRI | None | STORED GENERATED | | _id | varbinary(32) | NO | PRI | None | STORED GENERATED |
| _json_schema | json | YES | | None | VIRTUAL GENERATED | | _json_schema | json | YES | | None | VIRTUAL GENERATED |
+--------------+---------------+------+-----+---------+-------------------+ +--------------+---------------+------+-----+---------+-------------------+
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
Quelques fonctions intéressantes : Quelques fonctions intéressantes :
* `JSON_KEYS(doc)` retourne les propriétés (de premier niveau) de `doc`. * `JSON_KEYS(doc)` retourne les propriétés (de premier niveau) de `doc`.
* `JSON_KEYS(doc, path)` retourne les propriétés (de premier niveau) du composant de `doc` au bout du chemin `path`. * `JSON_KEYS(doc, path)` retourne les propriétés (de premier niveau) du composant de `doc` au bout du chemin `path`.
* `JSON_EXTRACT(doc, path)` extrait le composant de `doc` au bout du chemin `path`. * `JSON_EXTRACT(doc, path)` extrait le composant de `doc` au bout du chemin `path`.
* `JSON_PRETTY(doc)` retourne une chaîne de caractères permettant un affichage agréable de `doc`. * `JSON_PRETTY(doc)` retourne une chaîne de caractères permettant un affichage agréable de `doc`.
* `JSON_UNQUOTE(doc)` retourne `doc` sous la forme d'une chaîne de caractères sans guillemets. * `JSON_UNQUOTE(doc)` retourne `doc` sous la forme d'une chaîne de caractères sans guillemets.
Quel est le type de l'attribut `doc` ? Quel est le type de l'attribut `doc` ?
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
%%sql %%sql
DESCRIBE countryinfo; DESCRIBE countryinfo;
``` ```
%% Output %% Output
+--------------+---------------+------+-----+---------+-------------------+ +--------------+---------------+------+-----+---------+-------------------+
| Field | Type | Null | Key | Default | Extra | | Field | Type | Null | Key | Default | Extra |
+--------------+---------------+------+-----+---------+-------------------+ +--------------+---------------+------+-----+---------+-------------------+
| doc | json | YES | | None | | | doc | json | YES | | None | |
| _id | varbinary(32) | NO | PRI | None | STORED GENERATED | | _id | varbinary(32) | NO | PRI | None | STORED GENERATED |
| _json_schema | json | YES | | None | VIRTUAL GENERATED | | _json_schema | json | YES | | None | VIRTUAL GENERATED |
+--------------+---------------+------+-----+---------+-------------------+ +--------------+---------------+------+-----+---------+-------------------+
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
Quelles sont ses propriétés ? Quelles sont ses propriétés ?
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
%%sql %%sql
``` ```
%% Output %% Output
UsageError: %%sql is a cell magic, but the cell body is empty. Did you mean the line magic %sql (single %)? UsageError: %%sql is a cell magic, but the cell body is empty. Did you mean the line magic %sql (single %)?
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
Quelles sont les propriétés d'une `geography` ? Quelles sont les propriétés d'une `geography` ?
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
%%sql %%sql
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
Afficher toutes les régions distinctes Afficher toutes les régions distinctes
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
%%sql %%sql
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
Combien y a-t-il de régions ? Combien y a-t-il de régions ?
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
%%sql %%sql
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
## De SQL à JSON ## De SQL à JSON
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
Ecrire, à partir des relations `city` et `country` une requête qui retourne cinq villes et leur pays (sous la forme de simples chaînes de caractères). Ecrire, à partir des relations `city` et `country` une requête qui retourne cinq villes et leur pays (sous la forme de simples chaînes de caractères).
Le résultat est une table (un multi-ensemble de tuples). Le résultat est une table (un multi-ensemble de tuples).
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
%%sql %%sql
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
Réécrire la requête afin de retourner des documents JSON. Réécrire la requête afin de retourner des documents JSON.
Quelques fonctions intéressantes : Quelques fonctions intéressantes :
* `JSON_OBJECT(key, val[, key, val] ...])` retourne un objet JSON défini par les paires `key: val` fournies en paramètre (la notation avec des crochets et les points de suspension indique que les deux paramètres peuvent être répétés). * `JSON_OBJECT(key, val[, key, val] ...])` retourne un objet JSON défini par les paires `key: val` fournies en paramètre (la notation avec des crochets et les points de suspension indique que les deux paramètres peuvent être répétés).
* `JSON_ARRAY(val [, val] ...)` retourne un tableau JSON selon le même principe. * `JSON_ARRAY(val [, val] ...)` retourne un tableau JSON selon le même principe.
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
%%sql %%sql
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
## De JSON à SQL (optionnel) ## De JSON à SQL (optionnel)
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
Ecrire une requête qui retourne une table donnant la superficie de chacune des régions répertoriées dans la relation `countryinfo`, classée par superficie croissante. Ecrire une requête qui retourne une table donnant la superficie de chacune des régions répertoriées dans la relation `countryinfo`, classée par superficie croissante.
Une fonction intéressante : Une fonction intéressante :
* `JSON_TABLE(doc, path COLUMNS (name type PATH path[, name type PATH path] ...)) [AS] alias` retourne à partir du composant de `doc` au bout du chemin `path` une table nommée `alias` dont les colonnes sont spécifiées à l'aide des paramètres de `COLUMNS` (le chemin `path` des colonnes complète le chemin initial). * `JSON_TABLE(doc, path COLUMNS (name type PATH path[, name type PATH path] ...)) [AS] alias` retourne à partir du composant de `doc` au bout du chemin `path` une table nommée `alias` dont les colonnes sont spécifiées à l'aide des paramètres de `COLUMNS` (le chemin `path` des colonnes complète le chemin initial).
Conseil: Conseil:
* faire un produit de `countryinfo` et `JSON_TABLE(doc...)` pour obtenir le document associé à chaque tuple de `countryinfo` ; * faire un produit de `countryinfo` et `JSON_TABLE(doc...)` pour obtenir le document associé à chaque tuple de `countryinfo` ;
* commencer par simplement construire une table reprenant les régions et les superficies de chaque tuple/pays. * commencer par simplement construire une table reprenant les régions et les superficies de chaque tuple/pays.
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
%%sql %%sql
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
%%sql %%sql
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
## MongoDB ## MongoDB
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
En premier, exécutez le tutoriel présent à cette adresse : https://www.mongodb.com/docs/manual/tutorial/getting-started/. En premier, exécutez le tutoriel présent à cette adresse : https://www.mongodb.com/docs/manual/tutorial/getting-started/.
Ceci vous permettra d'avoir une vue sur les principales commandes de MongoDB : Ceci vous permettra d'avoir une vue sur les principales commandes de MongoDB :
- find() - find()
- delete() - delete()
- insertMany() - insertMany()
Des liens utiles pour la suite : Des liens utiles pour la suite :
- https://www.mongodb.com/docs/manual/crud/ - https://www.mongodb.com/docs/manual/crud/
- https://pymongo.readthedocs.io/en/stable/api/pymongo/collection.html - https://pymongo.readthedocs.io/en/stable/api/pymongo/collection.html
- https://www.mongodb.com/docs/manual/reference/sql-comparison/ - https://www.mongodb.com/docs/manual/reference/sql-comparison/
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
### Insérer World X dans MongoDB ### Insérer World X dans MongoDB
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
Vous allez copier le contenu de la table `countryinfo` (champ `doc` bien sûr) dans MongoDB à l'aide de la bibliothèque [pymongo](https://pymongo.readthedocs.io/en/stable/). Vous allez copier le contenu de la table `countryinfo` (champ `doc` bien sûr) dans MongoDB à l'aide de la bibliothèque [pymongo](https://pymongo.readthedocs.io/en/stable/).
Lisez le tutoriel [Pymongo](https://pymongo.readthedocs.io/en/stable/tutorial.html) pour avoir une idée générale du fonctionnement. Lisez le tutoriel [Pymongo](https://pymongo.readthedocs.io/en/stable/tutorial.html) pour avoir une idée générale du fonctionnement.
Conseils: Conseils:
* utilisez les DataFrame de Pandas * utilisez les DataFrame de Pandas
* utilisez `json.loads` et `to_numpy()` ("Convert the DataFrame to a NumPy array") pour transformer la base en tableau de dictionnaires * utilisez `json.loads` et `to_numpy()` ("Convert the DataFrame to a NumPy array") pour transformer la base en tableau de dictionnaires
* connectez-vous à la base `mongo` (regardez dans le `docker-compose.yml` comment c'est configuré) créez la base "world_x" et la collection "doc" * connectez-vous à la base `mongo` (regardez dans le `docker-compose.yml` comment c'est configuré) créez la base "world_x" et la collection "doc"
* utilisez `insert_many` de `pymongo` * utilisez `insert_many` de `pymongo`
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
from pymongo import MongoClient from pymongo import MongoClient
import pandas as pd import pandas as pd
import seaborn as sns import seaborn as sns
import json import json
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
result = %sql SELECT doc FROM countryinfo; result = %sql SELECT doc FROM countryinfo;
print(result) # type non exploitable en l'état print(result) # type non exploitable en l'état
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
df = pd.DataFrame(result) df = pd.DataFrame(result) # on passe par les DataFrame Pandas
print(df) print(df)
print(df["doc"]) print(df["doc"])
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
ar_docs = [json.loads(x) for x in df["doc"].to_numpy()] ar_docs = [json.loads(x) for x in df["doc"].to_numpy()] # on transforme en array NumPy
print(ar_docs) print(ar_docs)
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
client = MongoClient("mongodb://root:example@mongo:27017/") client = MongoClient("mongodb://root:example@mongo:27017/")
db =client["world_x"] db =client["world_x"]
collection = db["doc"] collection = db["doc"]
print(collection) print(collection)
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
collection.insert_many(ar_docs) collection.insert_many(ar_docs) # on peut directement insérer un array NumPy
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
Verifiez que vous avez toutes les données (239 documents), vous pouvez également le constater à l'aide du plugin. Verifiez que vous avez toutes les données (239 documents), vous pouvez également le constater à l'aide du plugin.
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
### Requêtes Mongo ### Requêtes Mongo
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
Afficher le premier document (élément) de la collection. Afficher le premier document (élément) de la collection.
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
Récupérez la liste de régions distinctes. Récupérez la liste de régions distinctes.
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
Vérifiez bien que vous obtenez autant qu'avec MySQL (239 documents). Vérifiez bien que vous obtenez autant qu'avec MySQL (239 documents).
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
Affichez la liste (limitée à 5 résultats) indiquant le nom, l'année d'indépendance et les informations démographiques pour les pays dont l'année d'indépendance est supérieure à 1980. Affichez la liste (limitée à 5 résultats) indiquant le nom, l'année d'indépendance et les informations démographiques pour les pays dont l'année d'indépendance est supérieure à 1980.
Regardez la [fonction `find`](https://www.mongodb.com/docs/manual/tutorial/query-documents/) Regardez la [fonction `find`](https://www.mongodb.com/docs/manual/tutorial/query-documents/)
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
Affichez la liste (limitée à 5 résultats) indiquant le nom, l'année d'indépendance et la population pour les pays dont le nombre d'habitant est supérieure à 3 millions. Affichez la liste (limitée à 5 résultats) indiquant le nom, l'année d'indépendance et la population pour les pays dont le nombre d'habitant est supérieure à 3 millions.
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
Ecrivez une requête affichant la somme des superficies pour chacune des régions. Pour cela il faut grouper les pays de la même région du monde. Ecrivez une requête affichant la somme des superficies pour chacune des régions. Pour cela il faut grouper les pays de la même région du monde.
Regardez du côté de la [commande `aggregate`](https://www.mongodb.com/docs/manual/aggregation/). Regardez du côté de la [commande `aggregate`](https://www.mongodb.com/docs/manual/aggregation/).
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
Complétez la requête précédente en classant par superficie croissante. Complétez la requête précédente en classant par superficie croissante.
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
Affichez les superficies par région avec Seaborn (utilisez `catplot` en mode `bar`). Affichez les superficies par région avec Seaborn (utilisez `catplot` en mode `bar`).
Pour transformer le tableau de résultats en DataFrame, vous pouvez utiliser `pd.json_normalize`. Pour transformer le tableau de résultats en DataFrame, vous pouvez utiliser `pd.json_normalize`.
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
df = pd.json_normalize(...) df = pd.json_normalize(...)
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
import seaborn as sns import seaborn as sns
sns.catplot(...) sns.catplot(...)
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
Testez d'autres requêtes et affichages. Testez d'autres requêtes et affichages.
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
``` ```
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment