MongoDB : Base de donnée orientée documents. UE « Systèmes dʹInformation Tactiq

MongoDB : Base de donnée orientée documents. UE « Systèmes dʹInformation Tactiques » Master 2 Génie Logiciel ISTIC, Université de Rennes 1 Année 2015-2016, second semestre Emmanuel Caruyer CR CNRS Emmanuel.Caruyer@irisa.fr Plan du cours MongoDB : Présentation générale SQL ou NoSQL ? Lʹorganisation en documents Un modèle sans schéma mais pas sans conception Améliorer les performances avec un index Développer avec MongoDB Utilisation de la console Javascript Interaction à lʹaide de lʹAPI Java Écriture dʹune requête Améliorer les performances avec un index Données géographiques Requêtes géographiques MongoDB : Bibliographie Kyle Banker, MongoDB in Action (Dec. 2011), Ed. Hanning. MongoDB Reference h8ps://docs.mongodb.org/manual/reference /database-references/ h8ps://docs.mongodb.org/ecosystem/drivers/java/ MongoDB : Présentation générale SQL ou NoSQL ? Lʹorganisation en documents Un modèle sans schéma mais pas sans conception SQL ou NoSQL ? MongoDB : Présentation générale Un SGBD innovant Base de donnée de type NoSQL (Not only SQL) Lʹélément de base est le document Un système ouvert et pensé Web Distribué sous licence AGPL (libre et ouvert) Format BSON, interactions Javascript, APIs via drivers Optimisé pour une disponibilité maximale Faible structuration relationelle au profit de la rapidité dʹaccès. Écrit en C++ Montée en charge par multiplication du nombre de serveurs Étude dʹun exemple : Blog (1) 1,1 0,N ECRIT 0,N 0,N COMMENTE commentaire_date_publication commentaire_texte 0,N 0,N APPARTIENT CATEGORIE categorie_id categorie_nom BILLET billet_id billet_url billet_titre billet_date_publication billet_texte AUTEUR auteur_id auteur_nom auteur_prenom VISITEUR visiteur_id visiteur_nom visiteur_prenom Étude dʹun exemple : Blog (2) Étude dʹun exemple : Blog (3) { _id: ObjectID('4bd9e8e17cefd644108961bb'), titre: "La Renault Twizy, entre scooter et citadine", auteur: "ecaruyer", categories: ["automobile", "écologie", "zéro émission"], commentaires: [ { visiteur: "david35", texte: "Merci pour cet article !" }, { visiteur: "melody_nelson", texte: "Cette voiture est top, mais pêche encore par son autonomie..." } ], texte: "La citadine <strong>Renault Twizy</strong> [...]" } Les documents contiennent des données typées Un modèle sans schéma a priori Lʹorganisation sous forme clé-valeurs Cʹest lʹapplication qui garantit la cohérence des données au sein dʹune collection Ce type de SGBD est particulièrement adapté au développement agile Les valeurs peuvent représenter des objets complexes ou des listes dʹobjets Un SGBD sans jointure ni transaction Toutes les informations recueillies par une requête se trouvent dans le document Favorise la rapidité et la simplicité au prix dʹune possible redondance dans les données Lʹimportance du design Compromis redondance/rapidité dʹexécution Les données dʹune requête se trouvent généralement toutes dans le document La taille maximale des documents est plafonnée (16Mo) Nécessité de trouver un compromis entre redondance et rapidité Remarques générales Importance des scenarii dʹutilisation (lectures/écritures) sur la façon dʹorganiser les données Ne pas se limiter à un enregistrement par document Quand le volume de données augmente, le nombre de documents doit augmenter Lʹimportance du design Bibliographie complémentaire Améliorer les performances avec un index (1) Comme les SGBD relationels, MongoDB utilise un B-Tree Indexation basée sur un quadtree Améliorer les performances avec un index (2) Les indexations ʺfull textʺ Un index inversé de tous les mots présents dans un champs Permet de faire des recherches par le contenu Lʹindexation géospatiale Développer avec MongoDB Utilisation de la console Javascript Interaction à lʹaide de lʹAPI Java Écriture dʹune requête Améliorer les performances avec un index Utilisation de la console Javascript (1) Lancement du serveur et de la console Le serveur se lance à lʹaide de la commande mongod.exe Lʹinterpréteur de commandes Javascript correspond à la commande mongo.exe Connexion ou création dʹune base de donnée use <nom_de_la_base> Insertion dʹun document dans une collection db.<nom_de_la_collection>.insert(<document>) Lecture dʹune collection db.<nom_de_la_collection>.find([paramètres]) Utilisation de la console Javascript (2) ecaruyer@victoria ~ $ mongo MongoDB shell version: 2.4.9 connecting to: test > use bibliographie switched to db bibliographie > document = { ... auteurs: ["Antoine Dupont", "Frédéric Petit"], ... titre: "Databases for the next generation", ... editeur: "University Press", ... pages: 525, ... categories: ["informatique", "vulgarisation", "technologies web"] ... } > db.articles.insert(document) > db.articles.find() { "_id" : ObjectId("569c5dac1dd328fd9d406fb0"), "auteurs" : [ "Antoine Dupont", "Frédéric Petit" ], "titre" : "Databases for the next generation", "editeur" : "University Press", "pages" : 525, "categories" : [ "informatique", "vulgarisation"] } Utilisation de la console Javascript (3) Modification dʹune entrée dans la base db.articles.find({auteurs: "Antoine Dupont"}) .update({"$addToSet": {"categories": "technologies web"}}) Modification de tutes les résultats dʹune requête db.articles.find({auteurs: "Antoine Dupont"}) .update({"$addToSet": {"categories": "technologies web"}}, false, true) Suppression dʹune entrée db.articles.remove({auteurs: "Antoine Dupont"}) Intéraction à lʹaide de lʹAPI Java // Create a client to connect to the MongoDB server on localhost MongoClient mongoClient = new MongoClient( "localhost" , 27017 ); // Connect to a specific database. // Note: if "mydb" does not exist, it'll be create on the first write. MongoDatabase database = mongoClient.getDatabase("bibliographie"); // Retrieve (or create) the collection "articles". MongoCollection collection = database.getCollection("article"); // Make a document and insert it Document doc = new Document("auteurs", Arrays.asList("Antoine Dupont", "Frédéric Petit")) .append("titre", "Databases for the next generation") .append("editeur", "University Press") .append("categories", Arrays.asList("informatique", "vulgarisation", "technologies web")); collection.insertOne(doc); // Query the collection Document myDoc = collection.find().first(); Écriture dʹune requête (1) Une requête est représentée par un document db.articles.find({editeur: "University Press"}) On peut enrichir une requête à lʹaide dʹopérateurs db.articles.find({pages: {"$gt": 500}}) db.articles.find({auteurs: {"$in": ["Eric Legrand", "Antoine Dupont"]}}) db.articles.find({auteurs: {$not: /^F/}}) db.billets.find({"categories": "automobile", "commentaires.visiteur": "melody_nelson"}}) db.billets.find({"$or": [{"categories": "automobile"}, {"commentaires.visiteur": "melody_nelson"}]}) Écriture dʹune requête (2) Récupération dʹun sous-ensemble du document (projection) Par soucis dʹoptimisation, on peut ne récupérer que les éléments nécessaires dʹun document db.articles.find({editeur: "University Press"}, {auteurs: 1}) Tri des résultats Il est possible de trier les résultats dʹune recherche db.articles.find({}).sort({titre: -1}) Améliorer les performances avec un index (1) Comprendre lʹexécution dʹune requête : explain() > db.articles.find({"auteurs.nom": "Dupont"}).explain() { "cursor" : "BasicCursor", "isMultiKey" : false, "n" : 1, "nscannedObjects" : 2, "nscanned" : 2, "nscannedObjectsAllPlans" : 2, "nscannedAllPlans" : 2, "scanAndOrder" : false, "indexOnly" : false, "nYields" : 0, "nChunkSkips" : 0, "millis" : 0, "indexBounds" : { }, "server" : "victoria:27017" } Améliorer les performances avec un index (2) Créer un index avec createIndex > db.articles.createIndex({"auteurs.nom": 1}) > db.articles.find({"auteurs.nom": "Dupont"}).explain() { "cursor" : "BtreeCursor auteurs.nom_1", "isMultiKey" : true, "n" : 1, "nscannedObjects" : 1, "nscanned" : 1, "nscannedObjectsAllPlans" : 1, "nscannedAllPlans" : 1, "scanAndOrder" : false, "indexOnly" : false, "nYields" : 0, "nChunkSkips" : 0, "millis" : 0, "indexBounds" : { "auteurs.nom" : [ [ "Dupont", "Dupont" ] ] }, "server" : "victoria:27017" } Données géographiques Requêtes géographiques (1) Exemple de collection contenant des données de géolocalisation { "_id" : ObjectId("4d291187888cec7267e55d24"), "city" : "New York City", "loc" : { "lon" : -73.9996 "lat" : 40.7402, }, "state" : "New York", "zip" : 10011 } Création dʹun index géographique > db.zips.createIndex({loc: '2dsphere'}) Requêtes géographiques (2) Récupération des k plus proches voisins > db.zips.find({'loc': {$near: [ -73.977842, 40.752315 ]}}).limit(3) Récupération des enregistrements à lʹintérieur dʹun disque > center = [-73.977842, 40.752315] > radius = 0.011 > db.zips.find({loc: {$within: {$center: [ center, radius ] }}}) Récupération des enregistrements à lʹintérieur dʹun rectangle > lower_left = [-73.977842, 40.752315] > upper_right = [-73.923649, 40.762925] > db.zips.find({loc: {$within: {$box: [ lower_left, upper_right ] }}}) Questions ? uploads/Management/ mongodb.pdf

  • 21
  • 0
  • 0
Afficher les détails des licences
Licence et utilisation
Gratuit pour un usage personnel Attribution requise
Partager
  • Détails
  • Publié le Nov 15, 2022
  • Catégorie Management
  • Langue French
  • Taille du fichier 2.5914MB