"Récupérez la liste de régions distinctes. Vérifiez bien que vous obtenez autant qu'avec MySQL. "
"Afficher le premier document (élément) de la collection."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Récupérez la liste de régions distinctes."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Vérifiez bien que vous obtenez autant qu'avec MySQL (239 documents). "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"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.\n",
"\n",
"Regardez la [fonction `find`](https://www.mongodb.com/docs/manual/tutorial/query-documents/)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"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."
]
},
{
...
...
@@ -339,9 +610,23 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Reproduisez la requête affichant la somme des superficies pour chacune des régions, classée par superficie croissante. \n",
"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. \n",
"\n",
"Pour cela regardez du côté de la commande `aggregate`."
"Regardez du côté de la [commande `aggregate`](https://www.mongodb.com/docs/manual/aggregation/)."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Complétez la requête précédente en classant par superficie croissante."
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:
Quelles sont les propriétés d'une `geography` ?
%% Cell type:code id: tags:
``` python
%%sql
```
%% Cell type:markdown id: tags:
Afficher toutes les régions distinctes
%% Cell type:code id: tags:
``` python
%%sql
```
%% Cell type:markdown id: tags:
Combien y a-t-il de régions ?
%% Cell type:code id: tags:
``` python
%%sql
```
%% Cell type:markdown id: tags:
## De SQL à JSON
%% 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).
Le résultat est une table (un multi-ensemble de tuples).
%% Cell type:code id: tags:
``` python
%%sql
```
%% Cell type:markdown id: tags:
Réécrire la requête afin de retourner des documents JSON.
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_ARRAY(val [, val] ...)` retourne un tableau JSON selon le même principe.
%% Cell type:code id: tags:
``` python
%%sql
```
%% Cell type:markdown id: tags:
## De JSON à SQL (optionnel)
%% 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.
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).
Conseil:
* 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.
%% Cell type:code id: tags:
``` python
%%sql
```
%% Cell type:code id: tags:
``` python
%%sql
```
%% Cell type:markdown id: tags:
## MongoDB
%% Cell type:markdown id: tags:
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 :
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.
Conseils:
* 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
* 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`
%% Cell type:code id: tags:
``` python
frompymongoimportMongoClient
importpandasaspd
importseabornassns
importjson
```
%% Cell type:code id: tags:
``` python
result=%sqlSELECT...;
```
%% Cell type:code id: tags:
``` python
df=pd.DataFrame(...)
```
%% Cell type:code id: tags:
``` python
ar_docs=[json.loads(x)forxin...]
```
%% Cell type:code id: tags:
``` python
client=MongoClient(...)
...
db=client[...]
collection=db[...]
```
%% Cell type:code id: tags:
``` python
collection.insert_many(ar_docs)
```
%% Cell type:markdown id: tags:
Verifiez que vous avez toutes les données (239 documents), vous pouvez également le constater à l'aide du plugin.
Reproduisez la requête affichant la somme des superficies pour chacune des régions, classée par superficie croissante.
Vérifiez bien que vous obtenez autant qu'avec MySQL (239 documents).
Pour cela regardez du côté de la commande `aggregate`.
%% Cell type:code id: tags:
``` python
```
%% 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.
Regardez la [fonction `find`](https://www.mongodb.com/docs/manual/tutorial/query-documents/)
%% Cell type:code id: tags:
``` python
```
%% 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.
%% Cell type:code id: tags:
``` python
```
%% 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.
Regardez du côté de la [commande `aggregate`](https://www.mongodb.com/docs/manual/aggregation/).
%% Cell type:code id: tags:
``` python
```
%% Cell type:markdown id: tags:
Complétez la requête précédente en classant par superficie croissante.
%% Cell type:code id: tags:
``` python
```
%% Cell type:markdown id: tags:
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`.