Intro to MongoDB
NodeJS #4
MongoDB
Système de gestion de bases de données orienté Document
- Schema-less,
- Performant (surtout en lecture),
- Coeur écrit en C++,
- Requêtes écrites en Javascript.
- Données stockées au format BSON (binary JSON).
- Automatic scaling.
NoSQL
Manipuler des BDD géantes pour des sites web de très grande audience
- Cassandra (Facebook),
- Neo4J,
- Redis,
- HBase (Facebook),
- Hypertable,
- CouchDB,
- MongoDB, ...
Not Only SQL
NoSQL vs SQL
Termes
MongoDB
{
"_id": ObjectId("4efa8d2b7d284dad101e4bc7"),
"Nom": "PELLERIN",
"Prénom": "Franck",
"Âge": 29,
"Adresse":
{
"Rue" : "1 chemin des Loges",
"Ville": "VERSAILLES"
}
}
Document
- Embedded documents and arrays reduce need for expensive joins.
- Dynamic schema supports fluent polymorphism.
MongoDB
Collection
MongoDB
brew update
brew install mongodb
Installation
Sur MacOS
Sur Ubuntu, ...
Sur Windows 😱
MongoDB
mkdir db
mongod --dbpath db
Démarrage
En développement
mongo
Lancer le mongo shell
MongoDB
db
Shell
BDD actuelle ?
show dbs
Toutes les BDD ?
MongoDB
use myDB
Usage
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)
MongoDB
Queries
MongoDB
Queries
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 ...
MongoDB
db.users.find({ $or: [ { status: "A" } , { age: 50 } ] })
Queries
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
MongoDB
Embedded
db.inventory.find( { 'producer.company': 'ABC123' } )
Embedded Document
db.things.insert(
{
thingId: 2,
producer: {
name: 'toto',
company: 'ABC123'
}
}
)
Avec des documents imbriqués
MongoDB
SQL to MongoDB
MongoDB
Insert one document
db.inventory.insert(
{
item: "ABC1",
details: {
model: "14Q3",
manufacturer: "XYZ Company"
},
stock: [ { size: "S", qty: 25 }, { size: "M", qty: 50 } ],
category: "clothing"
}
)
MongoDB
Insert several docs
var mydocuments = [...];
db.inventory.insert( mydocuments );
MongoDB
Modification
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
MongoDB
Modification
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)
MongoDB
Suppression
// 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)
MongoDB
Aggregation
MongoDB
Aggregation simple (distinct)
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)
[NODEJS] MongoDB (cours 4)
By Julien Herpin
[NODEJS] MongoDB (cours 4)
- 1,276