Webinaire ouvert "Fondamentaux de MongoDB"

Amis, le prochain lancement du cours sur les bases de données aura lieu demain, nous avons donc organisé une leçon traditionnelle ouverte, dont vous pouvez voir un enregistrement ici . Cette fois, nous avons parlé de la base de données populaire MongoDB: nous avons étudié certaines des subtilités, examiné les bases du travail, les fonctionnalités et l'architecture. Et aussi touché quelques cas d'utilisateurs.



Le webinaire a été dirigé par Ivan Remen , responsable du développement des serveurs chez Citimobil.


Caractéristiques de MongoDB


MongoDB est un système de gestion de base de données orienté document open source qui ne nécessite pas de description du schéma de table. Il est classé comme NoSQL et utilise BSON (JSON binaire). Mise à l'échelle, écrite en C ++ et prend en charge la syntaxe JavaScript. Pas de support SQL.

MongoDB possède des pilotes pour de nombreux langages de programmation populaires (C, C ++, C #, Go, Java, JavaScript, Perl, PHP, Python, Ruby, etc.). Il existe également des pilotes non officiels et pris en charge par la communauté pour d'autres langages de programmation.

Eh bien, regardons les commandes de base qui peuvent être utiles.

Donc, pour déployer MongoDB dans Docker , nous écrivons:

docker run -it --rm -p 127.0.0.1:27017:27017 --name mongo-exp-project mongo docker exec -it mongo-exp-project mongo 

Ainsi, le client MongoDB démarre :



Maintenant, écrivons le traditionnel Hello World :

 print (“Hello world!”) 



Après cela, exécutez la boucle :



Comme vous l'avez remarqué, nous avons régulièrement JS devant nous et MongoDB est un interpréteur JavaScript à part entière .

Quand utiliser MongoDB?


Il y a une histoire selon laquelle la startup moyenne de la Silicon Valley est l'homme qui a ouvert le livre «HTML for Dummies» il y a une semaine. Quelle pile choisira-t-il? Vous devez admettre que cela lui est très pratique lorsqu'il a JavaScript dans son navigateur pour des raisons évidentes, Node.js s'exécute sur le serveur et JavaScript est également dans la base de données. Ceci est le point numéro 1.

Deuxièmement, il y a une excellente présentation de Peter Zaitsev, l'un des meilleurs experts en bases de données en Russie. Dans ce document, Peter parle de MySQL et MongoDB, en se concentrant sur le moment et ce qui est le mieux à utiliser.

Troisièmement, je tiens à souligner que MongoDB se caractérise par une bonne évolutivité - et c'est l'une des principales caractéristiques de la base de données. Si vous ne savez pas à l'avance quelle sera la charge, MongoDB est parfait. De plus, il prend en charge des modèles prêts à l' emploi comme le partitionnement et la réplication , et tout cela est rendu assez transparent, c'est-à-dire qu'il est très pratique de travailler.

Quant à la terminologie dans MongoDB, alors:

  • les bases sont des bases (schémas, une totalité de tables);
  • dans MongoDB, il existe une collection - c'est un analogue d'un tableau et d'un ensemble de documents qui, selon la logique des choses, devraient être connectés;
  • les documents sont un analogue d'une ligne.

Création de base de données et requêtes simples


Pour créer une base de données, il vous suffit de commencer à l'utiliser:

 use learn 



Faites maintenant une petite insertion du document. Que ce soit, par exemple, une licorne nommée Aurora:

 db.unicorns.insert({name: 'Aurora', gender: 'f', weight: 450}) 

db est un objet global d'accès à la base de données, c'est-à-dire en fait la «monga» elle-même. Pour le sharding, sh est utilisé; pour la réplication, rs est utilisé .

Quelles sont les commandes de l'objet db :



Donc, revenons à notre équipe, à la suite de quoi la console signalera qu'une ligne est insérée:



Le mot unicorns dans la db.unicorns.insert({name: 'Aurora', gender: 'f', weight: 450}) signifie une collection. Veuillez noter ici que nous n'avons pas décrit ou créé la collection, mais simplement écrit «licornes», fait un insert et nous avons obtenu une collection.

Et ainsi nous pouvons obtenir toutes nos collections :

 db.getCollectionNames() 

Eh bien et ainsi de suite. Nous pouvons insérer une autre collection:



Et maintenant, nous allons demander une collection complète (nous rappelons que dans notre cas, la base de données contient déjà des informations sur deux licornes du même nom):

 db.unicorns.find() 

Veuillez noter, voici notre JSON (il y a un nom, un sexe, un poids, un identifiant unique de l'objet):



Insérons maintenant quelques licornes supplémentaires du même nom:

 db.unicorns.insert({name: 'Leto', gender: 'm', home: 'Arrakeen', worm: false}) db.unicorns.insert({name: 'Leto', gender: 'm', home: 'Arrakeen', worm: false}) 

Et voyons ce qui s'est passé:



Comme vous pouvez le voir, nous avons des champs supplémentaires: home et worm , qu'Aurora n'a pas.

Ajoutez quelques licornes supplémentaires:

 db.unicorns.insertMany([{name: 'Horny', dob: new Date(1992,2,13,7,47), loves: ['carrot','papaya'], weight: 600, gender: 'm', vampires: 63}, {name: 'Aurora', dob: new Date(1991, 0, 24, 13, 0), loves: ['carrot', 'grape'], weight: 450, gender: 'f', vampires: 43}, {name: 'Unicrom', dob: new Date(1973, 1, 9, 22, 10), loves: ['energon', 'redbull'], weight: 984, gender: 'm', vampires: 182}, {name: 'Roooooodles', dob: new Date(1979, 7, 18, 18, 44), loves: ['apple'], weight: 575, gender: 'm', vampires: 99}]) 

Nous avons donc inséré quatre autres objets en utilisant JavaScript:



Dans quelles bases de données pensez-vous qu'il est plus pratique de stocker les données de passeport: dans des bases de données relationnelles ou en mong?

La réponse est évidente - en mong, et l'exemple ci-dessus le montre bien. Ce n'est un secret pour personne que KLADR est une douleur dans la Fédération de Russie. Et le monga tombe très bien sur les adresses, car vous pouvez tout spécifier comme un tableau, et ce sera beaucoup plus facile à vivre. Et c'est un bon cas d'utilisation pour MongoDB .

Ajoutez plus de licornes:

 db.unicorns.insert({name: 'Solnara', dob: new Date(1985, 6, 4, 2, 1), loves:['apple', 'carrot', 'chocolate'], weight:550, gender:'f', vampires:80}); db.unicorns.insert({name:'Ayna', dob: new Date(1998, 2, 7, 8, 30), loves: ['strawberry', 'lemon'], weight: 733, gender: 'f', vampires: 40}); db.unicorns.insert({name:'Kenny', dob: new Date(1997, 6, 1, 10, 42), loves: ['grape', 'lemon'], weight: 690, gender: 'm', vampires: 39}); db.unicorns.insert({name: 'Raleigh', dob: new Date(2005, 4, 3, 0, 57), loves: ['apple', 'sugar'], weight: 421, gender: 'm', vampires: 2}); db.unicorns.insert({name: 'Leia', dob: new Date(2001, 9, 8, 14, 53), loves: ['apple', 'watermelon'], weight: 601, gender: 'f', vampires: 33}); db.unicorns.insert({name: 'Pilot', dob: new Date(1997, 2, 1, 5, 3), loves: ['apple', 'watermelon'], weight: 650, gender: 'm', vampires: 54}); db.unicorns.insert({name: 'Nimue', dob: new Date(1999, 11, 20, 16, 15), loves: ['grape', 'carrot'], weight: 540, gender: 'f'}); db.unicorns.insert({name: 'Dunx', dob: new Date(1976, 6, 18, 18, 18), loves: ['grape', 'watermelon'], weight: 704, gender: 'm', vampires: 165}); 



Faites maintenant attention aux documents. En tant que dob , nous stockons des objets entiers. Et il y a aussi des informations que la licorne aime, et tout le monde n'a pas ces données. Ainsi, l'intérieur est un tableau complet .

Par ailleurs, pour une sortie plus belle, vous pouvez appeler la méthode .pretty() à la fin de la commande de recherche:



Si vous devez obtenir des informations sur la dernière erreur , utilisez la commande suivante:

 db.getLastError() 

Cela peut être fait après chaque insertion, ou vous pouvez configurer Write Concern. Il est préférable de lire à ce sujet dans la documentation officielle , qui, soit dit en passant, est très informative en mong. À propos, il y a aussi un bon article sur ce sujet.

Passer à des requêtes plus complexes


Demande de valeur de champ exacte:

 db.unicorns.find({gender: 'm'}) 

En écrivant une telle demande, nous obtenons dans la sortie sur la console une liste de toutes les licornes mâles.

Vous pouvez également exécuter la requête immédiatement dans plusieurs champs : par sexe et par poids:



Ci-dessus, faites attention au sélecteur spécial $ gt , qui vous permet d'afficher toutes les licornes mâles pesant plus de 700.

Vous pouvez vérifier si le champ existe :

 db.unicorns.find({vampires: {$exists: false}}) 

Ou alors:

 db.unicorns.find({'parents.father': {$exists: true}}) 

La commande suivante affiche les licornes dont les noms commencent par les lettres A ou a:

 db.unicorns.find({name: {$regex: "^[Aa]"}}) 

Voyons maintenant une recherche dans un tableau . Question numéro 1: quelle sera la sortie de cette commande:

 db.unicorns.find({loves:'apple'}) 

C'est vrai: tous ceux qui aiment les pommes.

La commande suivante renverra uniquement les données de licorne qui ne contiennent que des pommes et des pastèques:

 db.unicorns.find({loves:[ "apple", "watermelon" ]}) 

Et encore une commande:

 db.unicorns.find({loves:[ "watermelon", "apple" ]}) 

Dans notre cas, il ne retournera rien, car lorsque nous passons un tableau, le premier élément est comparé au premier, le second au second, etc. C'est-à-dire que le tableau doit également coïncider dans les positions de ces valeurs.

Et voici à quoi ressemble une recherche dans un tableau à l' aide de l'opérateur OR :



L'exemple suivant nous montrera une recherche utilisant l'opérateur $ all . Et ici, la séquence est déjà sans principes:



Nous pouvons également rechercher par la taille du tableau:



Mais que se passe-t-il si nous voulons trouver un tableau supérieur à un? Il y a un opérateur $ where pour cela, avec lequel vous pouvez écrire des choses plus complexes:

 db.unicorns.find({$where: function() { return this.loves && (this.loves.length > 1) } }) 

Au fait, si vous voulez vous entraîner, voici un fichier avec des commandes.

Caractéristiques du curseur


Écartons-nous un peu et disons quelques mots sur les caractéristiques de monga:

  • find () et d'autres opérations ne renvoient pas de données - elles renvoient le soi-disant "curseur";
  • ce que nous voyons lorsque les données sont imprimées est le travail de l'interprète.

En tapant db.unicorns.find sans parenthèses, nous obtenons un indice:



Nous continuons à répondre aux demandes


Il y a aussi l'opérateur $ in:

 db.unicorns.find({weight: {$in: [650, 704]}}) 



Parlons maintenant de la mise à jour . Par exemple, changeons le poids des Roooooodles de licorne:

 db.unicorns.update({name: "Roooooodles"}, {weight: 2222}) 

À la suite de nos actions, le document sera complètement mis à jour et un seul champ spécifié y restera:



Autrement dit, la seule chose qui reste avec notre objet est le poids de 2222 et, bien sûr, id.

Vous pouvez résoudre ce problème avec $ set :

 db.unicorns.update({_id: ObjectId("5da6ea4d9703b8be0089e6db")}, {$set: { "name" : "Roooooodles", "dob" : ISODate("1979-08-18T18:44:00Z"), "loves" : [ "apple" ], "gender" : "m", "vampires" : 99}}) 




Il est également possible d' incrémenter des valeurs :



Il existe également upsert - une combinaison de mise à jour et d'insertion:



Et voici comment sélectionner des champs :





Reste à ajouter quelques mots sur les sauts et limites :



Chers collègues, c'est tout, si vous voulez connaître les détails, regardez l'intégralité de la vidéo . Et n'oubliez pas de laisser vos commentaires!

Source: https://habr.com/ru/post/fr474054/


All Articles