NodeJS #4
Système de gestion de bases de données orienté Document
Manipuler des BDD géantes pour des sites web de très grande audience
{
"_id": ObjectId("4efa8d2b7d284dad101e4bc7"),
"Nom": "PELLERIN",
"Prénom": "Franck",
"Âge": 29,
"Adresse":
{
"Rue" : "1 chemin des Loges",
"Ville": "VERSAILLES"
}
}
brew update
brew install mongodb
Sur MacOS
Sur Ubuntu, ...
Sur Windows 😱
mkdir db
mongod --dbpath db
En développement
mongo
Lancer le mongo shell
db
BDD actuelle ?
show dbs
Toutes les BDD ?
use myDB
Utiliser une base de données
use myNewDB
db.myNewCollection1.insert( { x: 1 } )
Créer une collection et une base de données (à la première insertion)
Modifiers : limit, sort, skip
MongoDB provides a db.collection.findOne() method as a special case of find() that returns a single document.
Criterias: $gt, $lt, $gte, $lte, $in, $nin, $eq ...
db.users.find({ $or: [ { status: "A" } , { age: 50 } ] })
Exclure l'ID et inclure le "name"
db.users.find()
db.users.find({ status: "A" });
db.records.find({ "user_id": { $lt: 42} }, { "_id": 0, "name": 1 })
Select all
Tous les champs avec status = A
Tous les champs avec status = A ou age = 50
db.inventory.find( { 'producer.company': 'ABC123' } )
Embedded Document
db.things.insert(
{
thingId: 2,
producer: {
name: 'toto',
company: 'ABC123'
}
}
)
Avec des documents imbriqués
db.inventory.insert(
{
item: "ABC1",
details: {
model: "14Q3",
manufacturer: "XYZ Company"
},
stock: [ { size: "S", qty: 25 }, { size: "M", qty: 50 } ],
category: "clothing"
}
)
var mydocuments = [...];
db.inventory.insert( mydocuments );
db.users.update(
{ age: { $gt: 25 } },
{ $set: { status: "C" } },
{ multi: true }
)
db.users.update(
{ },
{ $set: { join_date: new Date() } },
{ multi: true }
)
Modifier plusieurs items selon des critères
Ajouter un nouveau champ avec la date à tous les items
db.users.update(
{ },
{ $unset: { join_date: "" } },
{ multi: true }
)
Supprimer un champ pour tous les items
db.inventory.update(
{ item: "TBD1" },
{
item: "TBD1",
details: { "model" : "14Q4", "manufacturer" : "ABC Company" },
stock: [ { "size" : "S", "qty" : 25 } ],
category: "houseware"
},
{ upsert: true }
)
Remplacer complètement un doc ($upsert)
// Rm specific items
db.users.remove( { status: "D" } );
// Rm all
db.users.remove( {} );
exercice
mongoimport --db mydb --collection restaurants --drop --file dataset.json
https://raw.githubusercontent.com/mongodb/docs-assets/primer-dataset/dataset.json
1) Récupérer le dump json à l'adresse suivante
2) Importer le dump dans une collection "restaurants"
{
"address": {
"building": "1007",
"coord": [ -73.856077, 40.848447 ],
"street": "Morris Park Ave",
"zipcode": "10462"
},
"borough": "Bronx",
"cuisine": "Bakery",
"grades": [
{ "date": { "$date": 1393804800000 }, "grade": "A", "score": 2 },
{ "date": { "$date": 1378857600000 }, "grade": "A", "score": 6 }
],
"name": "Morris Park Bake Shop",
"restaurant_id": "30075445"
}
Exemple de document de la collection
exercice
3) Afficher le nombre total d'enregistrements.
4) Compter les restaurants dans le Bronx.
5) Afficher les restaurants dans le Bronx ou dans le Queens.
6) Afficher les restaurants dont le code postal est 11219.
7) Même que 6 mais n'afficher que les noms (sans ids).
8) Même que 7 mais trier par ordre alphabétique.
9) Afficher les restaurants qui ont obtenu un score supérieur ou égal à 20.
A l'aide de Robomongo 2 (ou du shell)
exercice
10) Afficher le nom du restaurant ayant pour identifiant 30075445.
11) Afficher les noms des 3 derniers restaurants de la liste triée par ordre alphabétique (par nom).
14) Créer un index sur le champ "name"
A l'aide de Robomongo 2 (ou du shell)
1) Lister les noms des quartiers (sans doublon !).
2) Afficher le nombre de quartiers différents.
3) Afficher le nombre de restaurants italiens dans chacun des quartiers.
4) Afficher les restaurants avec leur note moyenne ($unwind).
exercice
A l'aide de Robomongo 2 (ou du shell)