Webinar abierto "Fundamentos de MongoDB"

Amigos, el próximo lanzamiento del curso de Bases de datos tendrá lugar mañana, por lo que celebramos una lección abierta tradicional, una grabación de la cual pueden ver aquí . Esta vez hablamos sobre la popular base de datos MongoDB: estudiamos algunas de las sutilezas, examinamos los conceptos básicos del trabajo, las características y la arquitectura. Y también tocó algunos casos de usuario.



El seminario web fue realizado por Ivan Remen , jefe de desarrollo de servidores en Citimobil.


Características de MongoDB


MongoDB es un sistema de gestión de bases de datos orientado a documentos de código abierto que no requiere una descripción del esquema de la tabla. Está clasificado como NoSQL y usa BSON (JSON binario). Escalado de fábrica, escrito en C ++ y compatible con la sintaxis de JavaScript. No hay soporte SQL.

MongoDB tiene controladores para muchos lenguajes de programación populares (C, C ++, C #, Go, Java, JavaScript, Perl, PHP, Python, Ruby, etc.). También hay controladores no oficiales y compatibles con la comunidad para otros lenguajes de programación.

Bueno, echemos un vistazo a los comandos básicos que pueden ser útiles.

Entonces, para implementar MongoDB en Docker , escribimos:

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

Por lo tanto, el cliente MongoDB se inicia :



Ahora escribamos el tradicional Hello World :

 print (“Hello world!”) 



Después de eso, ejecute el bucle :



Como notó, tenemos JS regulares frente a nosotros, y MongoDB es un intérprete de JavaScript completo .

¿Cuándo usar MongoDB?


Hay una historia de que la startup promedio en Silicon Valley es el hombre que abrió el libro "HTML for Dummies" hace una semana. ¿Qué pila elegirá? Debe admitir que es muy conveniente para él cuando tiene JavaScript en su navegador por razones obvias, Node.js se está ejecutando en el servidor y JavaScript también está en la base de datos. Este es el punto número 1.

En segundo lugar, hay una excelente presentación de Peter Zaitsev, uno de los mejores expertos en bases de datos en Rusia. En él, Peter habla sobre MySQL y MongoDB, enfocándose en cuándo y qué es lo mejor para usar.

En tercer lugar, quiero enfatizar que MongoDB se caracteriza por una buena escalabilidad , y esta es una de las características clave de la base de datos. Si no sabe de antemano cuál será la carga, MongoDB es perfecto. Además, admite patrones listos para usar como fragmentación y replicación , y todo esto se hace bastante transparente, es decir, es muy conveniente trabajar.

En cuanto a la terminología en MongoDB, entonces:

  • las bases son bases (esquemas, una totalidad de tablas);
  • en MongoDB existe una colección : es un análogo de una tabla y un conjunto de documentos que deben conectarse de acuerdo con la lógica de las cosas;
  • Los documentos son análogos de una línea.

Creación de bases de datos y consultas simples.


Para crear una base de datos, solo necesita comenzar a usarla:

 use learn 



Ahora haga una pequeña inserción del documento. Que sea, por ejemplo, un unicornio llamado Aurora:

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

db es un objeto global para acceder a la base de datos, es decir, de hecho, la "monga" en sí misma. Para el fragmentación, se usa sh ; para la replicación, se usa rs .

Qué comandos tiene el objeto db :



Entonces, de vuelta a nuestro equipo, como resultado de lo cual la consola informará que se insertó una fila:



La palabra unicorns en el db.unicorns.insert({name: 'Aurora', gender: 'f', weight: 450}) significa una colección. Tenga en cuenta aquí que no describimos ni creamos la colección, sino que simplemente escribimos 'unicornios', hicimos un inserto y obtuvimos una colección.

Y así podemos obtener todas nuestras colecciones :

 db.getCollectionNames() 

Bueno y así sucesivamente. Podemos insertar otra colección:



Ahora solicitaremos una colección completa (recordamos que en nuestro caso la base de datos ya contiene información sobre dos unicornios con el mismo nombre):

 db.unicorns.find() 

Tenga en cuenta que aquí está nuestro JSON (hay un nombre, género, peso, algún identificador único del objeto):



Ahora insertemos un par de unicornios más con el mismo nombre:

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

Y veamos qué pasó:



Como puede ver, tenemos campos adicionales: hogar y gusano , que Aurora no tiene.

Agregue algunos unicornios más:

 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}]) 

Entonces, insertamos cuatro objetos más usando JavaScript:



¿En qué bases de datos cree que es más conveniente almacenar datos de pasaporte: en bases de datos relacionales o en mong?

La respuesta es obvia: en mong, y el ejemplo anterior lo muestra bien. No es ningún secreto que KLADR es un dolor en la Federación Rusa. Y la monga cae muy bien en las direcciones, porque puedes especificar todo como una matriz, y será mucho más fácil vivir. Y este es un buen caso de usuario para MongoDB .

Agrega más unicornios:

 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}); 



Ahora presta atención a los documentos. Como dob , almacenamos objetos completos. Y también hay información que le encanta al unicornio, y no todos tienen estos datos. Por lo tanto, dentro hay una matriz completa .

Por cierto, para obtener un resultado más hermoso, puede llamar al método .pretty() al final del comando de búsqueda:



Si necesita obtener información sobre el último error , use el siguiente comando:

 db.getLastError() 

Esto se puede hacer después de cada inserción, o puede configurar la preocupación de escritura. Es mejor leer al respecto en la documentación oficial , que, por cierto, es muy informativa en mong. Por cierto, también hay un buen artículo sobre el Habré sobre esto.

Pasando a consultas más complejas


Solicitud de valor de campo exacto:

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

Al escribir dicha solicitud, obtenemos en la salida de la consola una lista de todos los unicornios masculinos.

También puede ejecutar la consulta inmediatamente en varios campos : por sexo y por peso:



Arriba, preste atención al selector especial $ gt , que le permite mostrar todos los unicornios machos que pesen más de 700.

Puede verificar si el campo existe :

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

Más o menos:

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

El siguiente comando muestra unicornios cuyos nombres comienzan con las letras A o a:

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

Ahora veamos una búsqueda de matriz . Pregunta número 1: ¿cuál será la salida de este comando?

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

Así es: todos los que aman las manzanas.

El siguiente comando devolverá solo los datos de unicornio que contienen solo manzanas y sandías:

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

Y un comando más:

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

En nuestro caso, no devolverá nada, porque cuando pasamos una matriz, el primer elemento se compara con el primero, el segundo con el segundo, etc. Es decir, la matriz también debe coincidir en las posiciones de estos valores.

Y así es como se ve una búsqueda de matriz usando el operador OR :



El siguiente ejemplo nos mostrará una búsqueda usando el operador $ all . Y aquí la secuencia ya no tiene principios:



También podemos buscar por el tamaño de la matriz:



Pero, ¿qué pasa si queremos encontrar una matriz que sea más grande que una? Hay un operador $ where para esto, con el que puedes escribir cosas más complejas:

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

Por cierto, si quieres practicar, aquí hay un archivo con comandos.

Características del cursor


Divaguemos un poco y digamos algunas palabras sobre las características de monga:

  • find () y otras operaciones no devuelven datos: devuelven el llamado "cursor";
  • lo que vemos a medida que se imprimen los datos es el trabajo del intérprete.

Al escribir db.unicorns.find sin paréntesis, obtenemos una pista:



Seguimos cumpliendo solicitudes


También está el operador $ in:

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



Ahora hablemos de la actualización . Por ejemplo, cambiemos el peso del unicornio Roooooodles:

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

Como resultado de nuestras acciones, el documento se actualizará completamente y solo quedará un campo específico en él:



Es decir, lo único que queda con nuestro objeto es el peso de 2222 y, por supuesto, la identificación.

Puedes arreglar esto con $ set :

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




También es posible incrementar valores :



También hay upsert : una combinación de actualización e inserción:



Y aquí está cómo seleccionar campos :





Queda por agregar algunas palabras sobre saltar y limitar :



Colegas, eso es todo, si quieren conocer los detalles, miren el video completo . ¡Y no olvides dejar tus comentarios!

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


All Articles