Introduction
Introduction
Introduction
Plan
Introduction
1. Terminologie
SQL VS no-SQL
Relationnel VS non-relationnel
2. Le modèle relationnel
Relationnel VS non-relationnel
3.1 La distribution
4. Le théorème CAP
1 / 12
Plan
MongoDB
1. Relationnel VS Orienté document
1.1 Table VS Collection
La table La collection
est composée des colonnes et des est composée de documents
lignes
est structurée par un schéma est éventuellement structurée par un
validateur
DOIT être normalisée PEUT être normalisée
est mise en relation via des clés est mise en relation par imbrication ou par
étrangères référence
forme avec les autres tables un peut être shardée ou former un ensemble qui
ensemble qui peut être repliqué peut être répliqué
2 / 12
Plan
La table La collection
supporte les jointures ne supporte pas les jointures. Plusieurs
requêtes peuvent être nécessaires
3 / 12
Plan
use library
Inutile de créer explicitement la base de données ou les collections qui la compose comme
on le ferait avec une BDD relationnelle.
2.1 Create
// insertOne
db.books.insertOne({
"author": "Chinua Achebe",
"title": "Things Fall Apart",
"year": 1958
})
// insertMany
db.books.insertMany([
{
"author": "J.R.R. Tolkien",
"title": "The Hobbit",
"year": 1937
},
{
"author": "J.R.R. Tolkien",
"title": "The Fellowship of the Ring",
"year": 1954
},
{
"author": "J.R.R. Tolkien",
"title": "The Return of the King",
"year": 1954
}
])
2.2 Read
// find
db.books.find()
db.books.find({ "author": "J.R.R. Tolkien" })
// findOne
db.books.findOne({ "author": "Chinua Achebe" })
2.3 Update
// updateOne
db.books.updateOne(
4 / 12
Plan
// updateMany
db.books.updateMany(
{},
{ "$set": { "available": true } }
)
db.books.updateMany(
{ "year": { "$gt": 1950 } },
{ "$set": { "available": false } }
)
2.4 Delete
// deleteOne
db.books.deleteOne({ "author": "Chinua Achebe" })
// deleteMany
db.books.deleteMany({ "available": false })
Opérateur Exemple
$and { $and: [ { age: { $gt: 20 } }, { age: { $lt: 30 } ] } }
5 / 12
Plan
Opérateur Exemple
$or { $or: [ { age: { $lt: 20 } }, { age: { $gt: 30 } } ] }
$not { age: { $not: { $gt: 30 } } }
$nor { $nor: [ { age: { $gt: 30 } }, { age: { $lt: 20 } } ] }
Opérateur Exemple
$expr { $expr: { $gt: [ "$spent" , "$budget" ] } }
$jsonSchema CF:
https://www.mongodb.com/docs/manual/reference/operator/query/jsonSche
$mod { qty: { $mod: [ 4, 0 ] } }
$regex { name: { $regex: 'acme.*corp', $options: "si" } }
$where { $where: function() { return (hex_md5(this.name) ==
"9b53e667f30cd329dca1ec9e6a83e994") } }
$currentDate Sets the value of a field to current date, either as a Date or a Timestamp.
6 / 12
Plan
5. Types
6. Modélisation de BDD avec mongoDB
6.1 Embedded VS reference
// embedded
db.books.insertOne({
title: "Les Misérables",
genre: "Fiction",
publicationYear: 1862,
author: {
name: "Victor Hugo",
birthYear: 1802,
nationality: "French",
7 / 12
Plan
// reference
const authorId = db.authors.insertOne({
name: "Victor Hugo",
birthYear: 1802,
nationality: "French",
awards: ["Légion d'honneur"]
}).insertedId;
db.books.insertOne({
title: "Les Misérables",
genre: "Fiction",
publicationYear: 1862,
author: authorId,
pages: 1232
});
db.books.aggregate([
{
$lookup: {
from: 'authors',
localField: 'author',
foreignField: '_id',
as: 'author'
}
},
{
$match: { 'author.name': 'Victor Hugo' }
}
])
8 / 12
Plan
db.users.insertMany([
{ "_id": 1, "name": "Alice" },
{ "_id": 2, "name": "Bob" }
]);
db.products.insertMany([
{ "_id": 1001, "name": "Laptop", "price": 1000 },
{ "_id": 1002, "name": "Phone", "price": 500 }
]);
db.orders.insertMany([
{ "_id": 101, "userId": 1, "productId": 1001, "quantity": 2 },
{ "_id": 102, "userId": 1, "productId": 1002, "quantity": 1 },
{ "_id": 103, "userId": 2, "productId": 1002, "quantity": 1 },
{ "_id": 104, "userId": 2, "productId": 1002, "quantity": 1 }
]);
db.users.aggregate([
{
$lookup: {
from: "orders", // Collection `orders` à joindre
localField: "_id", // Champ local dans `users`
foreignField: "userId", // Champ correspondant dans `orders`
as: "userOrders" // Nom du champ contenant les données jointes
}
},
{ $unwind: "$userOrders" },
{
$lookup: {
from: "products", // Collection `products` à joindre
localField: "userOrders.productId", // Champ local dans `orders`
foreignField: "_id", // Champ correspondant dans `products`
as: "productDetails" // Nom du champ contenant les données
jointes
}
},
{ $unwind: "$productDetails" },
{
$project: {
_id: 1,
name: 1,
"orderId": "$userOrders._id",
"productName": "$productDetails.name",
"productPrice": "$productDetails.price",
"quantity": "$userOrders.quantity"
}
}
]);
db.users.aggregate([
{
$lookup: {
9 / 12
Plan
7. Les aggregats
db.produits.insertMany([
{ nom: "Laptop", categorie: "Electronique", prix: 1200, stock: 50, note:
4.5, ventes: 200 },
{ nom: "Téléphone", categorie: "Electronique", prix: 800, stock: 100,
note: 4.7, ventes: 500 },
{ nom: "Table", categorie: "Meuble", prix: 150, stock: 20, note: 4.1,
ventes: 30 },
{ nom: "Chaise", categorie: "Meuble", prix: 75, stock: 150, note: 3.8,
ventes: 120 },
{ nom: "Casque Audio", categorie: "Electronique", prix: 200, stock: 80,
note: 4.6, ventes: 300 },
{ nom: "Lampe", categorie: "Décoration", prix: 40, stock: 200, note: 4.0,
ventes: 80 },
{ nom: "Canapé", categorie: "Meuble", prix: 600, stock: 15, note: 4.4,
ventes: 20 },
{ nom: "Montre", categorie: "Accessoire", prix: 300, stock: 50, note: 4.8,
ventes: 150 },
{ nom: "Sac à dos", categorie: "Accessoire", prix: 90, stock: 70, note:
4.2, ventes: 100 },
{ nom: "Tapis", categorie: "Décoration", prix: 120, stock: 30, note: 4.3,
ventes: 60 }
]);
10 / 12
Plan
11 / 12
Plan
// 10. Regrouper les produits par catégorie et inclure une liste de leurs
noms
db.produits.aggregate([
{ $group: { _id: "$categorie", produits: { $push: "$nom" } } }
]);
12 / 12