Install MongoDB
Sources MongoDB
1/ Dossier log
-
Créer le dossier
C:/data/log
-
Changer le chemin dans le fichier de conf
mongo.cfg
2/ Lancer MongoDB
Linux :
$ sudo service mongod start
Windows :
$ net start MongoDB
3/ Lancer le shell mongo
mongo
est le shell de mongodb, c’est lui qui se charge d’interpréter les commandes
Use MongoDB
Créer une collection
Création :
> db.createCollection(NomCollection)
Exemple: Création de la collection etudiants
> db.createCollection('etudiants') --> {"ok":1}
Lecture :
> show collections --> > etudiants
Suppression
> db.NomCollection.drop()
Exemple: suppression de la collection etudiants
> db.etudiants.drop() --> > true
Renommer
> db.OLD_NAME.renameCollection("newname")
Exemple: renommer la collection etudiants en students
> db.etudiants.renameCollection("students")
Type de données dans MongoDB
-
String
-
Integer
-
Double
-
Boolean
-
Arrays
-
Date
-
Null
-
Object
-
Object ID
-
Code
Actions du CRUD
© Create
→ Create avec ma fonction insert()
ou save
Syntaxe basique:
> db.NomCollection.insert(<document>)
ou
> db.NomCollection.save(<document>)
Exercice 1 - Insertion
use TestDB
db.createCollection('ColEtu')
etu1={
"numEtudiant" : "etu2020001",
"firstname" : "Cecilia",
"lastname" : "Lawrence",
"cycle" : 2,
"adresse" : {
"num" : 12,
"rue" : "des Cailloux",
"ville" : "Amiens",
"pays" : "France"
},
"email" : ["lawrence@gmail.com"],
"cours" : [
{
"code" : "UE001",
"titre" : "réseaux",
"description" : "UE metier",
"credit" : 30
},
{
"code" : "UE005",
"titre" : "administration",
"description" : "UE spécialité",
"credit" : 20
},
{
"code" : "UE003",
"titre" : "systèmes",
"description" : "UE Option",
"credit" : 10
}
]
}
db.ColEtu.insert(etu1)
db.ColEtu.find().pretty()
Lien vers les etudiants:
Inserer l’ensemble des données, ici un tableau d’étudiants etudiants.json
db.ColEtu.insert(<etudiants.json>) db.ColEtu.find().pretty() db.ColEtu.findOne()
Requêtes sur les collections
Objet Cursor
Quand on interroge une collection c’est un objet cursor qui est retourné
var myCursor = db.etudiants.find() .... p39 du cours
Avec conditions et choix des champs à afficher/exclure
db.ColEtu.find({"cycle":{$lte:1}},{"firstname":1,"lastname":1,"cycle":1,_id:0}).pretty()
Avec sort()
db.ColEtu.find({"cycle":{$lte:2}},{"firstname":1,"lastname":1,"cycle":1,_id:0}).sort({lastname:-1}).pretty()
Mise à jour sur les collections
Exemple:
db.ColEtu.update({cycle:2}, {$set:{cycle:3}},{multi:true})
Aggregation
Regrouper les valeurs de plusieurs documents. Effectuer diverses opérations sur les données groupées.
Exemple avec Map-Reduce
var map = function(){emit(this.cycle,1)};
var reduce = function(key,values){return Array.sum(values)};
db.ColEtu.mapReduce(map,reduce,{out:"etuResult"})
db.etuResult.find()
db.ColEtu.distinct("cycle")
Indexation
Execution efficace des requêtes dans MongoDB.
Plus besoin d’analyser l’ensemble des éléments d’une collection pour avoir les resultats.
Syntaxe
db.collection.createIndex({champs},{options}) db.ColEtu.getIndexes() (1)
(1) Pour connaître les indexes existants
Les options posssibles
unique
sparse ex: indexer uniquement les etudiants du premier cycle
partial
TTL
name
background : l’indexation s’effectue en tâche de fond
Utilisation des index
Exemple :
db.ColEtu.createIndex({numEtudiant: 1},{unique: true})
for (i=0; i < 1000000; i++){
doc ={}
doc._id = i
doc.value = "Every where from " + i + " to ..."
doc.comment = "Hi ......." + i
db.testIndex.insert(doc)
}
Note
|
load("C:/Data/scripts/test_index.js") |
Visualiser la progression db.testIndex.count()
Sans index
db.testIndex.find({comment: "Hi .......12000"}).explain("executionStats")
Output
{ "queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "TestDB.testIndex",
"indexFilterSet" : false,
"parsedQuery" : {
"comment" : {
"$eq" : "Hi .......12000"
}
},
"winningPlan" : {
"stage" : "COLLSCAN",
"filter" : {
"comment" : {
"$eq" : "Hi .......12000"
}
},
"direction" : "forward"
},
"rejectedPlans" : [ ]
},
"executionStats" : {
"executionSuccess" : true,
"nReturned" : 1,
"executionTimeMillis" : 506,
"totalKeysExamined" : 0,
"totalDocsExamined" : 1000000,
"executionStages" : {
"stage" : "COLLSCAN",
"filter" : {
"comment" : {
"$eq" : "Hi .......12000"
}
},
"nReturned" : 1,
"executionTimeMillisEstimate" : 2,
"works" : 1000002,
"advanced" : 1,
"needTime" : 1000000,
"needYield" : 0,
"saveState" : 7812,
"restoreState" : 7812,
"isEOF" : 1,
"direction" : "forward",
"docsExamined" : 1000000
}
},
"serverInfo" : {
"host" : "DESKTOP-BCGBTAL",
"port" : 27017,
"version" : "4.2.3",
"gitVersion" : "6874650b362138df74be53d366bbefc321ea32d4"
},
"ok" : 1
}
Création de l’index
db.testIndex.createIndex({comment: 1},{background: true})
Avec index
db.testIndex.find({comment: "Hi .......12000"}).explain("executionStats")
Output
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "TestDB.testIndex",
"indexFilterSet" : false,
"parsedQuery" : {
"comment" : {
"$eq" : "Hi .......12000"
}
},
"winningPlan" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"comment" : 1
},
"indexName" : "comment_1",
"isMultiKey" : false,
"multiKeyPaths" : {
"comment" : [ ]
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"comment" : [
"[\"Hi .......12000\", \"Hi .......12000\"]"
]
}
}
},
"rejectedPlans" : [ ]
},
"executionStats" : {
"executionSuccess" : true,
"nReturned" : 1,
"executionTimeMillis" : 12,
"totalKeysExamined" : 1,
"totalDocsExamined" : 1,
"executionStages" : {
"stage" : "FETCH",
"nReturned" : 1,
"executionTimeMillisEstimate" : 11,
"works" : 2,
"advanced" : 1,
"needTime" : 0,
"needYield" : 0,
"saveState" : 1,
"restoreState" : 1,
"isEOF" : 1,
"docsExamined" : 1,
"alreadyHasObj" : 0,
"inputStage" : {
"stage" : "IXSCAN",
"nReturned" : 1,
"executionTimeMillisEstimate" : 11,
"works" : 2,
"advanced" : 1,
"needTime" : 0,
"needYield" : 0,
"saveState" : 1,
"restoreState" : 1,
"isEOF" : 1,
"keyPattern" : {
"comment" : 1
},
"indexName" : "comment_1",
"isMultiKey" : false,
"multiKeyPaths" : {
"comment" : [ ]
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"comment" : [
"[\"Hi .......12000\", \"Hi .......12000\"]"
]
},
"keysExamined" : 1,
"seeks" : 1,
"dupsTested" : 0,
"dupsDropped" : 0
}
}
},
"serverInfo" : {
"host" : "DESKTOP-BCGBTAL",
"port" : 27017,
"version" : "4.2.3",
"gitVersion" : "6874650b362138df74be53d366bbefc321ea32d4"
},
"ok" : 1
}
Important
|
On remarque que cette fois la base a cherché 1 document au lieu de 1000000 totalDocsExamined et le temps d’execution a été de "executionTimeMillisEstimate" : 11 au lieu de "executionTimeMillis" : 506
|
Insérer des images en base
"C:\Program Files\MongoDB\Server\4.2\bin\mongofiles.exe" -d gridTest put LOGO_MONGO.PNG mongo show dbs use gridTest show collections
fs.chunks
contient les binaries
fs.files
contient les metadonnées
Replication dans MongoDB
Voir Replication et système de sharding dans MongoDB
Administration d’une BBD MongoDB
Création d’un user Admin
use admin db.createUser( { "user": "myUserAdmin", "pwd": "rootMongo123", "roles": [ {"role": "userAdminAnyDatabase", "db": "admin"}, "readWriteAnyDatabase" ] })
Création d’un user supplementaire
use TestDB db.createUser( { "user": "myTester", "pwd": "testMongo123", "roles": [ {"role": "readWrite", "db": "TestDB"}, {"role": "read", "db": "SubscribersDB"} ] })