Un objet est-il une collection
de tables ou un document ?
https://slides.com/benoitchanclou
mailto:benoitchanclou@sfr.fr
| Tiers |
|---|
| String name |
| Club |
|---|
| String license |
| Rider |
|---|
| Date birthDate |
| Address |
|---|
| String street String zipCode String city |
*
| id | nom |
|---|---|
| 1 | Shamrock |
| 2 | Benoît |
| id | license |
|---|---|
| 1 | xxx |
Tiers
Clubs
| id | birthDate |
|---|---|
| 2 | xx/xx/xxxx |
Riders
| id | street | zipCode | city |
|---|---|---|---|
| 1 | Le bas verclé | 35740 | Pacé |
Address
ClubsRiders
| idClub | idRider |
|---|---|
| 1 | 2 |
| id | nom |
|---|---|
| 1 | Shamrock |
| 2 | Benoît |
| id | license |
|---|---|
| 1 | xxx |
Tiers
Clubs
| id | birthDate |
|---|---|
| 2 | xx/xx/xxxx |
Riders
Address
ClubsRiders
| idClub | idRider |
|---|---|
| 1 | 2 |
| id | street | zipCode | city |
|---|---|---|---|
| 1 | Le bas verclé | 35740 | Pacé |
{
"name": "Shamrock",
"license": "xxx",
"riders": [
...ref cavalier...
],
"address": {
"street": "le bas verclé",
"zipcode": "35740",
"city": "Pacé"
}
}{
"name": "Benoît",
"birthdate": ISODate("2018-09-01T12:00:00.000Z")
}(décrits en JSON)
(par exemple transmis dans une API REST)
akka
akka
akka
akka
akka
Mongo vs SQL
db.tiers.insert({
"name": "Benoît",
"birthdate": ISODate("2018-09-01T12:00:00.000Z")
}){
"_id" : ObjectId("5b8c507f7cd70b933d327b1e"),
"name" : "Benoît",
"birthdate" : ISODate("2018-09-01T12:00:00.000Z")
}db.tiers.insert({
"name": "Shamrock",
"license": "xxx",
"riders": [
ObjectId("5b8c507f7cd70b933d327b1e")
],
"address": {
"zipcode": "35740",
"city": "Pacé"
}
}){
"_id" : ObjectId("5b8c52ad7cd70b933d327b1f"),
"name" : "Shamrock",
"license" : "xxx",
"riders" : [
ObjectId("5b8c507f7cd70b933d327b1e")
],
"address" : {
"zipcode" : "35740",
"city" : "Pacé"
}
}on ajoute un champ "_type" ou "_class"
{
"_id" : ObjectId("5b8c52ad7cd70b933d327b1f"),
"_class" : "org.example.models.Club",
"name" : "Shamrock",
"license" : "xxx",
"riders" : [
ObjectId("5b8c507f7cd70b933d327b1e")
],
"address" : {
"zipcode" : "35740",
"city" : "Pacé"
}
}{
"_id" : ObjectId("5b8c507f7cd70b933d327b1e"),
"_class" : "org.example.models.Rider",
"name" : "Benoît",
"birthdate" : ISODate("2018-09-01T12:00:00.000Z")
}SQL
MongoDB
{
"addressStreet": "Le Bas Verclé",
"addressZipCode": "35740",
"addressCityName": "Pacé",
...
}{
"_version": 1
"address": {
"street": "Le Bas Verclé",
"zipCode": "35740",
"cityName": "Pacé"
},
...
}{
"_version": 2
"address": {
"street": "Le Bas Verclé",
"city" : {
"zipCode": "35740",
"name": "Pacé"
}
},
...
}var CONVERTERS = [
obj => { // Conversion de V0 en V1
obj.address = {
street: obj.addressStreet,
zipCode: obj.addressZipCode,
cityName: obj.addressCityName
};
delete obj.addressStreet;
delete obj.addressZipCode;
delete obj.addressCityName;
obj._version = 1;
},
obj => { // Conversion de V1 en V2
obj.address.city = {
zipCode: obj.address.zipCode,
name: obj.address.cityName
};
delete obj.address.zipCode;
delete obj.address.cityName;
obj._version = 2;
}
];
while (obj._version < CONVERTERS.length) {
CONVERTERS[obj._version](obj);
}Tant que l'objet n'est pas dans la dernière version on le convertit à la version suivante
Un document par modification, on stocke les deltas
sous forme de JSONPatch
{ "_id": ..., "id": 174, "userId": "xxx", "date": ISODate(...), patch: [
{ "op": "add", "path": "/attr1", "value": 165 }
] }
{ "_id": ..., "id": 174, "userId": "yyy", "date": ISODate(...), patch: [
{"op": "add", "path": "/attr2", "value": "A-1" }
] }
{ "_id": ..., "id": 174, "userId": "zzz", "date": ISODate(...), patch: [
{ "op": "replace", "path": "/attr1", "value": 184 }
] }Collection des objets
Collection d'historiques
# Meetup Mongo
* Lancer la console
```
$ mongo
```
Options pour se connecter sur un serveur et avec authentification
* Quelles sont les bases disponibles
```
show db
```
* Sélection de la base `meetup`
```
use meetup
```
Dès que la prochaine commande sera exécutée la base sera créée
* Création d'un tiers vide
```
db.tiers.insert({})
```
* Liste des documents
```
db.tiers.find()
```
* Suppression des documents
```
db.tiers.deleteMany({})
```
* Création d'un tiers physique
```
db.tiers.insert({
"name": "Benoît",
"birthdate": ISODate("2018-09-01T12:00:00.000Z")
})
```
* Création d'un tiers moral
```
db.tiers.insert({
"name": "Shamrock",
"license": "xxx",
"riders": [
ObjectId("5bc09283436d0906d01a43e7")
],
"address": {
"zipcode": "35740",
"city": "Pacé"
}
})
```
* Trouver un tiers
* avec un *name*
```
db.tiers.find({name:"Benoît"})
```
* avec un *zipcode*
```
db.tiers.find({"address.zipcode":"35740"})
```
* avec une *regex* sur le *name*
```
db.tiers.find({name:{$regex:/rock/}})
```
* avec l'existence d'un champ
```
db.tiers.find({license:{$exists: true}})
db.tiers.find({license:{$exists: false}})
```
* avec des valeurs possibles
```
db.tiers.find({name:{$in: ["Benoît", "Shamrock"]}})
```
* Modifier un tiers
* modifier un champs
```
db.tiers.update({name:"Shamrock"},{$set:{"_class" : "org.example.models.Club"}})
db.tiers.update({name:"Benoît"},{$set:{"_class" : "org.example.models.Rider"}})
```