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!