Install MongoDB

Sources MongoDB

1/ Dossier log

  1. Créer le dossier C:/data/log

  2. 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"}
    ]
})