Lenteur dans MongoDB : Solutions et Commandes
Lenteur dans MongoDB : Solutions et Commandes
Commandes de base
1. Vérification de la version
mongod --version
C:\NWindows\NSystem32>mongod --version
version de la base de données : v4.2.7
version git : 51d9fe12b5d19720e72dcd7db0f2f17dd9a19212
allocateur : tcmalloc
modules : aucun
environnement de construction :
distmod : 2012plus
distarch : x86_64
target_arch : x86_64
mongo -version
C:\NWindows\NSystem32>mongo --version
MongoDB shell version v4.2.7
version git : 51d9fe12b5d19720e72dcd7db0f2f17dd9a19212
allocateur : tcmalloc
modules : aucun
environnement de construction :
distmod : 2012plus
distarch : x86_64
architecture_cible : x86_64
Cette commande aidera les utilisateurs à trouver toutes les commandes qui peuvent
être utilisées dans MongoDB. Exécutez la commande sur Mongo Shell.
help()
mongo> db.help()
Méthodes de la base de données :
db.adminCommand(nameOrDocument) - bascule dans la base de données "admin" et exécute la
commande [appelle simplement db.runCommand(...)]
db.aggregate([pipeline], {options}) - effectue une agrégation sans collection sur cette base de données
; renvoie un curseur
db.auth(nom d'utilisateur, mot de passe)
db.cloneDatabase(fromhost) - ne fonctionne qu'avec MongoDB 4.0 et moins
db.commandHelp(name) renvoie l'aide de la commande
db.copyDatabase(fromdb, todb, fromhost) - ne fonctionne qu'avec MongoDB 4.0 et moins
db.createCollection(name, {size : ..., capped : ..., max : ...})
db.createUser(userDocument)
db.createView(name, viewOn, [{$operator : {...}}, ...], {viewOptions})
db.currentOp() affiche les opérations en cours d'exécution dans la base de données
db.dropDatabase(writeConcern)
db.dropUser(nomd'utilisateur)
db.eval() - obsolète
db.fsyncLock() envoie les données sur le disque et verrouille le serveur pour les sauvegardes
db.fsyncUnlock() déverrouille le serveur après un db.fsyncLock()
db.getCollection(cname) identique à db['cname'] ou db.cname
db.getCollectionInfos([filter]) - renvoie une liste contenant les noms et les options des collections de
la base de données
db.getCollectionNames()
db.getLastError() - renvoie la chaîne de caractères du message d'erreur
db.getLastErrorObj() - renvoie l'objet d'état complet
db.getLogComponents()
db.getMongo() récupère l'objet de connexion au serveur
db.getMongo().setSlaveOk() autorise les requêtes sur un serveur esclave de réplication
db.getName()
db.getProfilingLevel() - obsolète
db.getProfilingStatus() - renvoie si le profilage est activé et si le seuil de lenteur est atteint
db.getReplicationInfo()
db.getSiblingDB(name) récupère la base de données sur le même serveur que celle-ci
db.getWriteConcern() - renvoie le souci d'écriture utilisé pour toutes les opérations sur cette base de
données, hérité de l'objet serveur s'il est défini
db.hostInfo() obtient des détails sur l'hôte du serveur
db.isMaster() vérifie le statut primaire du réplica
db.killOp(opid) tue l'opération en cours dans la base de données
db.listCommands() liste toutes les commandes de la base de données
db.loadServerScripts() charge tous les scripts dans db.system.js
db.logout()
db.printCollectionStats()
db.printReplicationInfo()
db.printShardingStatus()
db.printSlaveReplicationInfo()
db.resetError()
db.runCommand(cmdObj) exécute une commande de base de données. si cmdObj est une chaîne, elle
est transformée en {cmdObj : 1}
db.serverStatus()
db.setLogLevel(level,<component>)
db.setProfilingLevel(level,slowms) 0=off 1=slow 2=all
db.setVerboseShell(flag) affiche des informations supplémentaires dans la sortie de l'interpréteur de
commandes
db.setWriteConcern(<préoccupation d'écriture doc>) - définit la préoccupation d'écriture pour les
écritures dans la base de données
db.shutdownServer()
db.stats()
db.unsetWriteConcern(<préoccupation d'écriture doc>) - désactive la préoccupation d'écriture pour
les écritures dans la base de données
db.version() version actuelle du serveur
db.watch() - ouvre un curseur de flux de changement pour une base de données afin de signaler toutes
les modifications apportées à ses collections hors système.
La commande ci-dessous vous donnera des détails sur les bases de données ainsi
que sur plusieurs collections et paramètres connexes de cette base de données.
db.stats()
> db.stats()
{
"db" : "test",
"collections" : 0,
"vues" : 0,
"objets" : 0,
"avgObjSize" : 0,
"dataSize" : 0,
"storageSize" : 0,
"numExtents" : 0,
"index" : 0,
"indexSize" : 0,
"scaleFactor" : 1,
"fileSize" : 0,
"fsUsedSize" : 0,
"fsTotalSize" : 0,
"ok" : 1
}
Cette commande simple permet de créer une nouvelle base de données si elle
n’existe pas ou de basculer vers la base de données existante. Dans MongoDB, “test”
est la base de données par défaut et les utilisateurs utilisent donc la base de données
“test” une fois que Mongo Shell est connecté.
use DB_Name
Copy
La commande mentionnée est utilisée pour lister toutes les bases de données.
show dbs
Copy
Exécutez la commande suivante sur Mongo Shell pour voir la base de données
actuellement utilisée.
db
> db
GeekFlare
db.dropDatabase()
Commençons par lister toutes les bases de données, basculons sur l’une d’entre elles
et abandonnons-la
Syntaxe: db.createCollection(Name,Options)
Copy
Dans cette collection, vous limitez la taille et le nombre des documents à insérer dans
la collection. La collection plafonnée possède une propriété qui permet de supprimer
les documents les plus anciens pour faire de la place aux nouveaux documents.
Syntaxe:
> db.createCollection("Login",{capped:true,max:1,size:200})
{ "ok" : 1 }
>
> > db.Login.insertMany([{"id":1,status : "Active"},{"id":2,status : "Hold"},{"id":3,status : "Pending"}])
{
"acknowledged" : vrai,
"insertedIds" : [
ObjectId("5edc5f4f411247725e75e52e"),
ObjectId("5edc5f4f411247725e75e52f"),
ObjectId("5edc5f4f411247725e75e530")
]
}
>
> db.Login.find()
{ "_id" : ObjectId("5edc5f4f411247725e75e530"), "id" : 3, "status" : "Pending" }
Copy
9. Drop Collection
La commande Drop Collection est similaire à DDL dans un SGBDR. Elle acquiert des
verrous sur la collection requise jusqu’à l’exécution de la commande. La commande
Drop Collection supprime la collection de la base de données ainsi que tous les index
associés à cette collection. La méthode drop() est nécessaire pour supprimer la
collection.
Elle renvoie un message vrai si l’abandon est réussi et un message faux en cas
d’erreur ou si la base de données n’existe pas.
Syntaxe: collectionName.drop()
Exemple:
Copy
Opérations CRUD
10. Insérer un document dans une collection
Pour créer un document, la méthode insert() est utilisée. La méthode insert() crée un
ou plusieurs documents dans la collection existante. Elle crée également une
collection si elle n’est pas présente dans la base de données. Dans MongoDB, le
document est sans schéma, ce qui signifie qu’il n’y a aucune restriction quant à
l’insertion d’un nombre quelconque de clés dans un document.
Syntaxe: collectionName.insertOne({document})
Exemple:
> db.geekFlareCollection.insertOne( {
code : "P123", Qty : 200, status : "Active"
}) ;
{
"acknowledged" : vrai,
"insertedId" : ObjectId("5ed309725429283aee2e134d")
}
Copy
Syntaxe:
collectionName.insertMany([{document1},{document2},{document3}....{ documentn}])
Exemple:
db.geekFlareCollection.insertMany([
... { code : "P1", Qty : 100, statut : "Active"},
... { code : "P2", Qté : 200, statut : "Actif"},
... { code : "P3", Qté : 0, statut : "Déctif"}
... ]) ;
{
"acknowledged" : vrai,
"insertedIds" : [
ObjectId("5edf7b4e18b2c26b9dfe8cac"),
ObjectId("5edf7b4e18b2c26b9dfe8cad"),
ObjectId("5edf7b4e18b2c26b9dfe8cae")
]
}
> db.geekFlareCollection.find()
{ "_id" : ObjectId("5edf546fdfa12b33b7cb75b8"), "product" : "bottles", "Qty" : 100 }
{ "_id" : ObjectId("5edf546fdfa12b33b7cb75b9"), "produit" : "pain", "Qté" : 20 }
{ "_id" : ObjectId("5edf546fdfa12b33b7cb75ba"), "produit" : "yaourt", "Qté" : 30 }
{ "_id" : ObjectId("5edf7b4e18b2c26b9dfe8cac"), "code" : "P1", "Qté" : 100, "status" : "Active" }
{ "_id" : ObjectId("5edf7b4e18b2c26b9dfe8cad"), "code" : "P2", "Qté" : 200, "statut" : "Actif" }
{ "_id" : ObjectId("5edf7b4e18b2c26b9dfe8cae"), "code" : "P3", "Qté" : 0, "status" : "Dective" }
>
Copy
bulk.insert({document1} ) ;
bulk.insert({document2} ) ;
bulk.insert({documentn} ) ;
bulk.execute() ;
Copy
Exemple :
Copy
Pour rechercher un document stocké dans une collection, vous pouvez utiliser la
méthode find(). La commande ci-dessous sera utilisée pour récupérer tous les
documents de la collection.
Syntaxe: collectionNom.find()
> db.geekFlareCollection.find()
{"_id" : ObjectId("5ed31186b6f2c2bb1edb86ce"), "code" : "P1", "Qty" : 200, "status" : "Active" }
{ "_id" : ObjectId("5ed31186b6f2c2bb1edb86cf"), "code" : "P2", "Qté" : 200, "statut" : "Actif" }
{ "_id" : ObjectId("5ed31186b6f2c2bb1edb86d0"), "code" : "P3", "Qté" : 200, "statut" : "Actif" }
{ "_id" : ObjectId("5ed3159eb6f2c2bb1edb86d1"), "code" : "P4", "Qté" : 100, "status" : "Inactive" }
Copy
Exemple:
Copy
Syntaxe: collectionName.findOne()
Copy
Syntaxe: collectionName.find().pretty()
Exemple:
Copy
MongoDB propose la méthode update() pour définir de nouvelles valeurs pour les clés
existantes dans les documents. La commande de mise à jour donne des détails sur les
documents modifiés et correspondants. La syntaxe de la commande de mise à jour
est la suivante :
Exemple:
> db.geekFlareCollection.find()
{"_id" : ObjectId("5edf3f67d6bfbd8125f58cfb"), "product" : "bottles", "Qty" : 100 }
{ "_id" : ObjectId("5edf3f67d6bfbd8125f58cfc"), "produit" : "pain", "Qté" : 20 }
{ "_id" : ObjectId("5edf3f67d6bfbd8125f58cfd"), "produit" : "yaourt", "Qté" : 30 }
>
> db.geekFlareCollection.update({"product" : "bottles"},{$set : {"Qty" : 10}} )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
>
> db.geekFlareCollection.find()
{ "_id" : ObjectId("5edf3f67d6bfbd8125f58cfb"), "product" : "bottles", "Qty" : 10 }
{ "_id" : ObjectId("5edf3f67d6bfbd8125f58cfc"), "produit" : "pain", "Qté" : 20 }
{ "_id" : ObjectId("5edf3f67d6bfbd8125f58cfd"), "produit" : "yaourt", "Qté" : 30 }
>
> db.geekFlareCollection.find()
{ "_id" : ObjectId("5edf3f67d6bfbd8125f58cfb"), "produit" : "bouteilles", "Qté" : 10 }
{ "_id" : ObjectId("5edf3f67d6bfbd8125f58cfc"), "produit" : "pain", "Qté" : 20 }
{ "_id" : ObjectId("5edf3f67d6bfbd8125f58cfd"), "produit" : "yaourt", "Qté" : 30 }
Copy
• updateOne():
Pour mettre à jour un seul document, il existe la méthode
updateOne (). updateOne() donne le nombre de documents correspondants et
modifiés.
Exemple:
Copy
Exemple:
Copy
Exemple:
Copy
Exemple:
Copy
• <strong>remove </strong>()
Il existe une autre méthode pour supprimer tous les
documents correspondant aux critères de suppression. La méthode remove()
prend deux arguments, l’un étant la condition de suppression et l’autre un
simple drapeau.
Syntaxe: collectionName.remove({DeletionCondition},1)
Exemple:
Copy
Syntaxe: collectionName.distinct(field)
Exemple:
> db.geekFlareCollection.distinct("produit")
[ "Cheese", "Snacks2", "Snacks3", "bread", "ketchup" ]
Copy
Syntaxe: collectionName.distinct(field,query)
Exemple:
> db.geekFlareCollection.distinct('product',{"Qty":20})
["Snacks3", "pain" ]
Copy
Syntaxe: collectionName.renameCollection(newCollectionName)
Exemple:
>db.geekFlareCollection.renameCollection('geekFlareCol')
{ "ok" : 1 }
> afficher les collections
geekFlareCol
Copy
Indexation
17. Créer un index sur le document
Les index sont une structure de données spéciale qui stocke une petite partie de
l’ensemble des données de la collection sous une forme facile à parcourir. Les index
permettent de classer les valeurs des champs par ordre croissant ou décroissant, ce
qui améliore les performances lors de la recherche.
Syntaxe: collectionName.createIndex({Key:1})
La clé indique le champ sur lequel l’index est créé et 1 signifie l’ordre croissant. Pour
créer un index dans l’ordre décroissant, vous pouvez utiliser -1.
Exemple:
Copy
Syntaxe: collectionName.createIndex({Key1:1,key2:1...keyn:1})
Exemple:
Copy
MongoDB propose la méthode getIndexes() pour répertorier tous les index créés sur un
document.
Syntaxe: collectionName.getIndexes()
Exemple: > db.geekFlareCollection.getIndexes()
> db.geekFlareCollection.getIndexes()
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "geekFlareCollection.geekFlareCollection"
}
]
Copy
Syntaxe: collectionName.dropIndex({key})
Exemple:
Copy
Syntaxe: collectionName.dropIndexes({key1,key2...,keyN})
Exemple:
Copy
Récupération liée
20. Limiter la recherche de documents
la méthode limit( ) permet de limiter le nombre de documents retournés. La méthode
limit() accepte des arguments numériques.
Syntaxe: collectionName.find().limit(number)
> db.geekFlareCollection.find().limit(2)
{ "_id" : ObjectId("5ed3c9e7b6f2c2bb1edb8702"), "product" : "bottles", "Qty" : 100 }
{ "_id" : ObjectId("5ed3c9e7b6f2c2bb1edb8703"), "produit" : "pain", "Qté" : 20 }
Copy
Syntaxe: collectionName.find().skip(number)
> db.geekFlareCollection.find().skip(2)
{ "_id" : 3, "product" : "yogurt", "Qty" : 30 }
> db.geekFlareCollection.find().skip(3)
Copy
La méthode MongoDB sort () permet de trier les documents de sortie dans l’ordre
croissant ou décroissant. Cette méthode accepte le nom des clés et le nombre pour
spécifier l’ordre de tri. 1 est utilisé pour l’ordre croissant tandis que -1 est utilisé pour
spécifier l’ordre décroissant.
Syntaxe: collectionName.find().sort({key:1})
Exemple:
> db.geekFlareCollection.find().sort({"Qty":1})
{ "_id" : 2, "product" : "bread", "Qty" : 20 }
{ "_id" : 3, "product" : "yogurt", "Qty" : 30 }
{ "_id" : 1, "product" : "bottles", "Qty" : 100 }
Copy
Validation liée
23. Validation des documents
Exemple :
> db.createCollection("Login",
... { validator : { $and :
... [
... { phone : { $type : "string" } },
... { email : { $regex : /@flares\.com$/ } },
... { status : { $in : [ "Registered", "Unknown" ] } } }
... ]
... }
... } )
{ "ok" : 1 }
>
> db.Login.insert({phone:1234})
WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 121,
"errmsg" : "La validation du document a échoué"
}
})
>
> db.Login.insert({phone : "1234",email : "[email protected]",status : "Unknown",mode : "limited"})
WriteResult({ "nInserted" : 1 })
Copy
Exemple:
> db.createCollection("Login", {
... validator : { $jsonSchema : {
... bsonType : "object",
... "additionalProperties" : false,
... required : ["email" ],
... propriétés : {
... email : {
... bsonType : "string",
... pattern : "@flares\c.com$",
... description : "string meets the given expression"
... },
... statut : {
... enum : [ "registered", "Invalid" ],
... description : "Le statut doit être compris dans les valeurs de l'enum"
... }
... }
... } },
... } )
{ "ok" : 1 }
>
> db.Login.insert({email : "[email protected]"})
WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 121,
"errmsg" : "La validation du document a échoué"
}
})
Copy
25. Mettre à jour ou créer des validateurs de schéma sur une collection
existante
Un validateur peut être créé sur une collection existante en utilisant collMod
Exemple :
> db.runCommand( {
collMod : "Login",
validator : { $jsonSchema : {
bsonType : "object",
"additionalProperties" : false,
required : ["email", "status" ],
properties : {
email : {
bsonType : "string",
pattern : "@flares\c.com$",
description : "string meets the given expression"
},
status : {
enum : [ "registered", "Invalid" ],
description : "le statut doit être compris dans les valeurs de l'énumération"
}
}
} },
validationAction : "error",
validationLevel : "strict"
})
{ "ok" : 1 }
Copy
Exemple:
> db.runCommand({
collMod : "Login",
validator:{},
validationLevel : "off"
})
{ "ok" : 1 }
>
> db.Login.insert({"email" : "abc"})
WriteResult({ "nInserted" : 1 })
Copy
Exemple:
Copy
Curseurs liés
28. Curseur dans MongoDB
Le curseur est un pointeur qui permet d’itérer sur l’ensemble des résultats. MongoDB
utilise les méthodes <strong>hasNext()</strong> et <strong>forEach()</strong> pour
l’itération. Une liste des méthodes de curseur a été fournie.
Exemples:
Copy
Utilité
29. Sauvegarde d’une base de données
Syntaxe de la commande :
mongodump --db dbName --out outFile --host "IP:PORT" --username <user> --password <pass>
Exemple :
Copy
Exemple:
Copy
31. Exportation des collections
Exemple:
Copy
Syntaxe: mongoexport --db dbName --collection collectionName --out outputFile --fields fieldname
Exemple:
Copy
Pour importer des données à partir d’un fichier (CSV ou JSON), vous pouvez utiliser
l’outil de ligne de commande mongoimport.
Copy
Relatif à la réplique
La réplication est différente du sharding, consultez ce guide pour implémenter le
sharding.
rs.initiate( { _id : "rs0", members : [ { _id : 0, host : "IP:27017" }, { _id : 1, host : "IP:27018" }, { _id : 2, host :
"IP:27019" } ] })
> rs.initiate( {
... _id : "rs0",
... membres : [
... { _id : 0, host : "localhost:27017" },
... { _id : 1, host : "localhost:27018" },
... { _id : 2, host : "localhost:27019" }
... ]
... })
{
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1591089166, 1),
"signature" : {
"hash" : BinData(0, "AAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1591089166, 1)
}
Copy
rs.conf()
rs.status()
rs0:PRIMARY> rs.conf()
{
"_id" : "rs0",
"version" : 2,
"protocolVersion" : NumberLong(1),
"writeConcernMajorityJournalDefault" : true,
"members" : [
{
"_id" : 0,
"host" : "localhost:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : faux,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 1,
"host" : "localhost:27018",
"arbiterOnly" : faux,
"buildIndexes" : true,
"hidden" : faux,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "localhost:27019",
"arbiterOnly" : faux,
"buildIndexes" : true,
"hidden" : faux,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 3,
"host" : "localhost:27016",
"arbiterOnly" : faux,
"buildIndexes" : true,
"hidden" : faux,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
}
],
"settings" : {
"chainingAllowed" : true,
"heartbeatIntervalMillis" : 2000,
"heartbeatTimeoutSecs" : 10,
"electionTimeoutMillis" : 10000,
"catchUpTimeoutMillis" : -1,
"catchUpTakeoverDelayMillis" : 30000,
"getLastErrorModes" : {
},
"getLastErrorDefaults" : {
"w" : 1,
"wtimeout" : 0
},
"replicaSetId" : ObjectId("5ed6180d01a39f2162335de5")
}
}
Copy
Syntaxe: rs.add("hostname:port")
rs0:PRIMARY> rs.add("localhost:27016")
{
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1591094195, 1),
"signature" : {
"hash" : BinData(0, "AAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1591094195, 1)
}
Copy
Syntaxe: rs.remove("localhost:27017")
Exemple:
rs0:PRIMARY> rs.remove("localhost:27016")
{
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1591095681, 1),
"signature" : {
"hash" : BinData(0, "AAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1591095681, 1)
}
rs0:PRIMARY>
Copy
Exemple:
rs0:PRIMARY> rs.stepDown(12)
{
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1591096055, 1),
"signature" : {
"hash" : BinData(0, "AAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1591096055, 1)
}
rs0:SECONDARY>
Copy
La commande ci-dessous sera utilisée pour vérifier le délai de réplication entre tous
les ensembles de répliques du primaire.
Syntaxe: rs.printSlaveReplicationInfo()
Exemple:
rs0:PRIMARY> rs.printSlaveReplicationInfo()
source : localhost:27018
syncedTo : Tue Jun 02 2020 16:14:04 GMT 0530 (India Standard Time)
0 sec (0 hrs) derrière le primaire
source : localhost:27019
syncedTo : Thu Jan 01 1970 05:30:00 GMT 0530 (India Standard Time)
1591094644 secs (441970.73 hrs) derrière la source primaire
source : localhost:27016
syncedTo : Tue Jun 02 2020 16:14:04 GMT 0530 (India Standard Time)
0 sec (0 hrs) derrière le primaire
rs0:PRIMARY>
Copy
Transactions liées
39. Transactions dans MongoDB
MongoDB prend en charge les propriétés ACID pour les transactions sur les
documents.
Pour lancer une transaction, une session est nécessaire pour démarrer, et la validation
est nécessaire pour enregistrer les modifications dans la base de données. Les
transactions sont prises en charge sur les ensembles de répliques ou les mangos. Une
fois que la session a été validée avec succès, les opérations effectuées à l’intérieur de
la session seront visibles à l’extérieur.
• Démarrer la transaction,
Syntaxe: session.startTransaction()
• Validation de la transaction
Syntaxe: session.commitTransaction()
Exemple:
Copy
• session1.startTransaction()
• session2.startTransaction()
Effectuez des insertions/mises à jour sur Session1 puis sur Session2. Observez
maintenant l’erreur dans l’exemple ci-dessous
Exemple:
rs0:PRIMARY> session1.startTransaction()
rs0:PRIMAIRE> session2.startTransaction()
rs0:PRIMAIRE> session1.getDatabase("geekFlareDB").geekFlareCollection.update({_id:3},{$set:{ product :
"Bread" }})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
rs0:PRIMARY> session2.getDatabase("geekFlareDB").geekFlareCollection.update({_id:3},{$set:{ product :
"Snacks" }})
WriteCommandError({
"errorLabels" : [
"TransientTransactionError"
],
"operationTime" : Timestamp(1591174593, 1),
"ok" : 0,
"errmsg" : "WriteConflict",
"code" : 112,
"codeName" : "WriteConflict",
"$clusterTime" : {
"clusterTime" : Timestamp(1591174593, 1),
"signature" : {
"hash" : BinData(0, "AAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
})
rs0:PRIMARY>
Copy
• db.getMongo().startTransaction()
• session.commitTransaction()
Exemple:
Copy
42. Profilage dans MongoDB
Syntaxe:
db.setProfilingLevel(profilingLevel,{"slowms":time, "sampleRate":LoggingPercentage})
Copy
Syntaxe: db.getProfilingStatus()
> db.getProfilingStatus()
{ "was" : 2, "slowms" : 1, "sampleRate" : 1 }
Copy
Syntaxe:
Exemple:
Syntaxe: collectionName.explain("verbosityName")
Regardez l’exemple ci-dessous, dans lequel ces étapes ont été exécutées :
> db.runCommand(
... {
... explain : { count : "product", query : { Qty : { $gt : 10 } } },
... verbosity : "executionStats"
... }
... )
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "test.product",
"indexFilterSet" : false,
"winningPlan" : {
"stage" : "COUNT",
"inputStage" : {
"stage" : "EOF"
}
},
"rejectedPlans" : [ ]
},
"executionStats" : {
"executionSuccess" : true,
"nReturned" : 0,
"executionTimeMillis" : 47,
"totalKeysExamined" : 0,
"totalDocsExamined" : 0,
"executionStages" : {
"stage" : "COUNT",
"nReturned" : 0,
"executionTimeMillisEstimate" : 0,
"works" : 1,
"advanced" : 0,
"needTime" : 0,
"needYield" : 0,
"saveState" : 0,
"restoreState" : 0,
"isEOF" : 1,
"nCounted" : 0,
"nSkipped" : 0,
"inputStage" : {
"stage" : "EOF",
"nReturned" : 0,
"executionTimeMillisEstimate" : 0,
"works" : 0, "advanced" : 0, "executionTimeMillisEstimate" : 0
"advanced" : 0,
"needTime" : 0,
"needYield" : 0,
"saveState" : 0,
"restoreState" : 0,
"isEOF" : 1
}
}
},
"serverInfo" : {
"host" : "MCGL-4499",
"port" : 27017,
"version" : "4.2.7",
"gitVersion" : "51d9fe12b5d19720e72dcd7db0f2f17dd9a19212"
},
"ok" : 1
}
>
Copy
> var expv = db.geekFlareCol.explain("executionStats")
> expv.find( { product : "bread"} )
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "geekFlareDB.geekFlareCol",
"indexFilterSet" : false,
"parsedQuery" : {
"product" : {
"$eq" : "bread"
}
},
"winningPlan" : {
"stage" : "COLLSCAN",
"filter" : {
"product" : {
"$eq" : "pain"
}
},
"direction" : "forward"
},
"rejectedPlans" : [ ]
},
"executionStats" : {
"executionSuccess" : true,
"nReturned" : 2,
"executionTimeMillis" : 0,
"totalKeysExamined" : 0,
"totalDocsExamined" : 6,
"executionStages" : {
"stage" : "COLLSCAN",
"filter" : {
"product" : {
"$eq" : "bread"
}
},
"nReturned" : 2,
"executionTimeMillisEstimate" : 0,
"works" : 8,
"advanced" : 2,
"needTime" : 5,
"needYield" : 0,
"saveState" : 0,
"restoreState" : 0,
"isEOF" : 1,
"direction" : "forward",
"docsExamined" : 6
}
},
"serverInfo" : {
"host" : "MCGL-4499",
"port" : 27017,
"version" : "4.2.7",
"gitVersion" : "51d9fe12b5d19720e72dcd7db0f2f17dd9a19212"
},
"ok" : 1
}
>
Copy
Contrôle d’accès
44. Contrôle d’accès dans MongoDB
utilisez admin
Exemple :
db.createUser(
... {
... utilisateur : "AdminUser",
... pwd : passwordPrompt(),
... roles : [ { role : "userAdminAnyDatabase", db : "admin" }, "readWriteAnyDatabase" ]
... }
... )
Entrez le mot de passe :
L'utilisateur a été ajouté avec succès : {
"user" : "AdminUser",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
},
"readWriteAnyDatabase"
]
}
Copy
Copy
• db.getUser("AdminUser")
• db.dropUser("AdminUser")
> db.getUser("AdminUser")
{
"_id" : "admin.AdminUser",
"userId" : UUID("78d2d5bb-0464-405e-b27e-643908a411ce"),
"user" : "AdminUser",
"db" : "admin",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
},
{
"role" : "readWriteAnyDatabase",
"db" : "admin"
}
],
"mechanisms" : [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
]
}
> db.dropUser("AdminUser")
true
> db.getUser("AdminUser")
null
>
Copy
Syntaxe:
Exemple:
utilisez admin
> db.createRole(
... {
... rôle : "abc",
... privilèges : [ { resource : { db : "geekFlareDB", collection : "geekFlareCol" }, actions : [ "killop" , "inprog"]
} } ],
... rôles : []
... }
... )
{
"role" : "abc",
"privileges" : [
{
"resource" : {
"db" : "geekFlareDB",
"collection" : "geekFlareCol"
},
"actions" : [
"killop",
"inprog"
]
}
],
"roles" : [ ]
}
Copy
Exemple:
> db.getUser("AdminUser")
{
"_id" : "admin.AdminUser",
"userId" : UUID("fe716ed1-6771-459e-be13-0df869c91ab3"),
"user" : "AdminUser",
"db" : "admin",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
},
{
"role" : "readWriteAnyDatabase",
"db" : "admin"
}
],
"mechanisms" : [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
]
}
> db.revokeRolesFromUser("AdminUser", [{"role" : "userAdminAnyDatabase" , db : "admin"} ] )
> db.getUser("AdminUser")
{
"_id" : "admin.AdminUser",
"userId" : UUID("fe716ed1-6771-459e-be13-0df869c91ab3"),
"user" : "AdminUser",
"db" : "admin",
"roles" : [
{
"role" : "readWriteAnyDatabase",
"db" : "admin"
}
],
"mechanisms" : [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
]
}
>