MongoDB Análisis de conceptos

No importa qué base de datos aprendamos, debemos aprender sus conceptos básicos. En MongoDB, los conceptos básicos son documentos, colecciones y bases de datos. A continuación, los presentamos uno por uno.

La siguiente tabla le ayudará a comprender más fácilmente algunos conceptos en MongoDB:

Términos/conceptos SQL Términos/conceptos MongoDB Explicación/descripción
database database Base de datos
table collection Tabla de base de datos / colección
row document Fila de registro de datos / documento
column field Campo de datos / dominio
index index Índice
table joins   Unión de tablas, no soportada por MongoDB
primary key primary key Clave primaria, MongoDB establece automáticamente el campo _id como clave primaria

A través del siguiente ejemplo gráfico, también podemos entender de forma más intuitiva algunos conceptos de Mongo:

Lista completa de términos:

  • Documento: Es la unidad básica de datos de MongoDB, generalmente una estructura tipo JSON, que puede contener múltiples tipos de datos.

  • Colección: Similar a una tabla en una base de datos relacional, una colección es un contenedor de un grupo de documentos. En MongoDB, los documentos en una colección no necesitan tener un esquema fijo.

  • Base de datos: Instancia de MongoDB que contiene una o más colecciones.

  • BSON: Abreviatura de Binary JSON, es la forma binaria de JSON que MongoDB utiliza para almacenar y transmitir documentos.

  • Índice: Estructura de datos utilizada para optimizar el rendimiento de las consultas. Se pueden crear índices basados en uno o más campos de una colección.

  • Fragmentación (Sharding): Método para distribuir datos en múltiples servidores (llamados fragmentos), utilizado para manejar grandes conjuntos de datos y aplicaciones de alto rendimiento.

  • Conjunto de réplicas (Replica Set): Grupo de servidores MongoDB que mantienen el mismo conjunto de datos, proporcionando respaldo redundante y alta disponibilidad.

  • Nodo primario: Servidor en el conjunto de réplicas encargado de manejar todas las operaciones de escritura.

  • Nodo secundario: Servidores en el conjunto de réplicas, utilizados para leer datos y asumir el rol de nodo primario cuando el nodo primario falla.

  • MongoDB Shell: Interfaz de línea de comandos proporcionada por MongoDB para interactuar con la instancia de MongoDB.

  • Marco de agregación (Aggregation Framework): Serie de operaciones para realizar procesamiento de datos complejo y operaciones de agregación.

  • Map-Reduce: Modelo de programación para el cálculo paralelo de grandes conjuntos de datos.

  • GridFS: Especificación para almacenar y recuperar archivos más grandes que el límite de tamaño de los documentos BSON.

  • ObjectId: Identificador único generado automáticamente por MongoDB para cada documento.

  • Operaciones CRUD: Operaciones de crear (Create), leer (Read), actualizar (Update) y eliminar (Delete).

  • Transacciones: Compatible desde MongoDB 4.0, permite que un grupo de operaciones se ejecute como una unidad atómica.

  • Operadores: Campos especiales utilizados para consultar y actualizar documentos.

  • Unión (Join): MongoDB permite usar en consultas$lookupoperadores para lograr operaciones de unión similares a SQL.

  • TTL(Time-To-Live): Se puede establecer TTL en ciertos campos de la colección para eliminar automáticamente datos antiguos.

  • Motor de almacenamiento: Tecnología subyacente que MongoDB utiliza para el almacenamiento y gestión de datos, como WiredTiger y el antiguo motor de almacenamiento MMAPv1.

  • MongoDB Compass: Herramienta de interfaz gráfica de MongoDB para visualizar y gestionar datos de MongoDB.

  • MongoDB Atlas: Servicio en la nube proporcionado por MongoDB que permite alojar bases de datos MongoDB en la nube.


Base de datos

En una MongoDB se pueden crear múltiples bases de datos.

Si no se especifica una base de datos al operar, MongoDB utilizará una llamadatestbase de datos predeterminada, que se almacena en el directorio data.

Una única instancia de MongoDB puede contener múltiples bases de datos independientes, cada una con sus propias colecciones y permisos. Diferentes bases de datos también se colocan en diferentes archivos.

A partir de MongoDB 4.0, se admite la ejecución de transacciones de múltiples documentos en una sola base de datos.

"show dbs"El comando puede mostrar la lista de todas las bases de datos.

$ ./mongo
MongoDB shell version: 3.0.6
connecting to: test
> show dbs
local  0.078GB
test   0.078GB
> 

Ejecutar"db"El comando puede mostrar el objeto de base de datos actual o las colecciones.

$ ./mongo
MongoDB shell version: 3.0.6
connecting to: test
> db
test
> 

Ejecutando el comando "use", puede conectarse a una base de datos específica.

> use local
switched to db local
> db
local
> 

En el comando de ejemplo anterior, "local" es la base de datos a la que desea conectarse.

En el próximo capítulo explicaremos en detalle el uso de comandos en MongoDB.

Las bases de datos también se identifican por nombre. El nombre de la base de datos puede ser cualquier cadena UTF-8 que cumpla las siguientes condiciones.

  • No puede ser una cadena vacía ("").
  • No debe contener ' ' (espacio), ., $, /, \ y \0 (carácter nulo).
  • Debe estar en minúsculas.
  • Máximo 64 bytes.

Algunos nombres de bases de datos están reservados; es posible acceder directamente a estas bases de datos con funciones especiales.

  • admin: Desde la perspectiva de permisos, esta es la base de datos "root". Si se añade un usuario a esta base de datos, el usuario hereda automáticamente los permisos de todas las bases de datos. Algunos comandos específicos del servidor solo pueden ejecutarse desde esta base de datos, como listar todas las bases de datos o apagar el servidor.
  • local:Estos datos nunca se replican y pueden utilizarse para almacenar cualquier colección limitada a un único servidor local.
  • config: Cuando Mongo se utiliza en una configuración de fragmentación, la base de datos config se usa internamente para guardar información relacionada con la fragmentación.

Documento

Un documento es un conjunto de pares clave-valor (es decir, BSON). Los documentos de MongoDB no necesitan tener los mismos campos, y los mismos campos no necesitan tener el mismo tipo de datos. Esto es una gran diferencia con las bases de datos relacionales y es una característica muy destacada de MongoDB.

Un ejemplo sencillo de documento es el siguiente:

{"site":"www.example.com", "name":"Ejemplo"}

La siguiente tabla enumera los términos correspondientes entre RDBMS y MongoDB:

RDBMS MongoDB
Base de datos Base de datos
Tabla Colección
Línea Documento
columna Campo
Unión de tablas Documento embebido
Clave primaria Clave primaria (MongoDB proporciona la clave _id)
Servicio de base de datos y cliente
Mysqld/Oracle mongodb
mysql/sqlplus mongo

Cabe señalar que:

  1. Los pares clave/valor en un documento están ordenados.
  2. Los valores en un documento no solo pueden ser cadenas entre comillas dobles, sino también otros tipos de datos (incluso un documento embebido completo).
  3. MongoDB distingue entre tipos y mayúsculas/minúsculas.
  4. Los documentos de MongoDB no pueden tener claves duplicadas.
  5. Las claves de un documento son cadenas. Salvo algunas excepciones, las claves pueden usar cualquier carácter UTF-8.

Reglas de nomenclatura para claves de documentos:

  • Las claves no pueden contener \0 (carácter nulo). Este carácter se utiliza para indicar el final de la clave.
  • . y $ tienen un significado especial; solo pueden usarse en ciertos contextos.
  • Las claves que comienzan con guion bajo "_" están reservadas (no es un requisito estricto).

Colección

Una colección es un grupo de documentos de MongoDB, similar a una tabla en RDBMS (Sistema de gestión de bases de datos relacionales: Relational Database Management System).

Las colecciones existen en la base de datos y no tienen una estructura fija. Esto significa que puede insertar datos de diferentes formatos y tipos en una colección, pero normalmente los datos que insertamos en una colección tienen cierta relación.

Por ejemplo, podemos insertar en la colección documentos con las siguientes estructuras de datos diferentes:

{"site":"www.baidu.com"}
{"site":"www.google.com","name":"Google"}
{"site":"www.example.com","name":"Ejemplo","num":5}

Cuando se inserta el primer documento, se crea la colección.

Nombres de colección válidos

  • El nombre de la colección no puede ser una cadena vacía "".
  • El nombre de la colección no puede contener el carácter \0 (carácter nulo); este carácter indica el final del nombre de la colección.
  • El nombre de la colección no puede comenzar con "system.", ya que es un prefijo reservado para colecciones del sistema.
  • Los nombres de colección creados por el usuario no pueden contener caracteres reservados. Algunos controladores admiten incluir [caracteres reservados] en el nombre de la colección, porque algunas colecciones generadas por el sistema los contienen. A menos que necesite acceder a estas colecciones creadas por el sistema, nunca utilice $ en el nombre.

Como en el siguiente ejemplo:

db.col.findOne()

capped collections

Las Capped collections son colecciones de tamaño fijo.

Tienen un alto rendimiento y la característica de expiración de cola (la expiración sigue el orden de inserción). Es similar al concepto de "RRD".

Las Capped collections mantienen automáticamente el orden de inserción de los objetos con alto rendimiento. Son muy adecuadas para funciones como el registro de logs. A diferencia de las colecciones estándar, debes crear explícitamente una capped collection especificando el tamaño de la colección en bytes. El espacio de almacenamiento de datos de la colección se asigna previamente.

Las Capped collections pueden guardar los documentos en la colección según su orden de inserción, y la ubicación de estos documentos en el disco también se guarda en orden de inserción. Por lo tanto, al actualizar documentos en una Capped collection, el documento actualizado no puede superar el tamaño del documento anterior; así se asegura que la posición de todos los documentos en el disco permanezca constante.

Como la Capped collection determina la posición de inserción según el orden de inserción de los documentos en lugar de usar índices, esto puede mejorar la eficiencia al agregar datos. El archivo de registro de operaciones de MongoDB, oplog.rs, se implementa utilizando Capped Collection.

Hay que tener en cuenta que el tamaño de almacenamiento especificado incluye la información de cabecera de la base de datos.

db.createCollection("mycoll", {capped:true, size:100000})
  • En una capped collection, puedes agregar nuevos objetos.
  • Se pueden realizar actualizaciones; sin embargo, el objeto no aumentará su espacio de almacenamiento. Si aumenta, la actualización fallará.
  • Con Capped Collection no se puede eliminar un documento; se puede utilizar el método drop() para eliminar todas las filas de la colección.
  • Después de eliminarla, debes volver a crear explícitamente esta colección.
  • En máquinas de 32 bits, el almacenamiento máximo de una capped collection es 1e9 (1×109) bytes.

Metadatos

La información de la base de datos se almacena en colecciones. Estas utilizan el espacio de nombres del sistema:

dbname.system.*

En la base de datos MongoDB, el espacio de nombres <dbname>.system.* contiene colecciones especiales con diversa información del sistema, como sigue:

Espacio de nombres de la colección Descripción
dbname.system.namespaces Lista todos los espacios de nombres.
dbname.system.indexes Lista todos los índices.
dbname.system.profile Contiene información de perfil (profile) de la base de datos.
dbname.system.users Lista todos los usuarios que pueden acceder a la base de datos.
dbname.local.sources Contiene información y estado del servidor de los peers de replicación (esclavos).

Existen las siguientes restricciones para modificar objetos en las colecciones del sistema.

Insertar datos en {{system.indexes}} permite crear índices. Pero aparte de eso, la información de esta tabla es inmutable (el comando especial drop index actualizará automáticamente la información relacionada).

{{system.users}} es modificable. {{system.profile}} es eliminable.


Tipos de datos de MongoDB

La siguiente tabla muestra varios tipos de datos comunes en MongoDB.

Tipo de dato Descripción
StringCadena (String). Tipo de dato común para almacenar datos. En MongoDB, solo son válidas las cadenas codificadas en UTF-8.
IntegerEntero (Integer). Se utiliza para almacenar valores numéricos. Puede ser de 32 o 64 bits según el servidor que se utilice.
BooleanBooleano (Boolean). Se utiliza para almacenar valores booleanos (verdadero/falso).
DoubleValor de coma flotante de doble precisión (Double). Se utiliza para almacenar valores flotantes.
Min/Max keysCompara un valor con el valor mínimo y máximo de un elemento BSON (JSON binario).
ArraySe utiliza para almacenar una matriz o lista o múltiples valores como una clave.
TimestampMarca de tiempo (Timestamp). Registra el momento específico en que se modifica o agrega un documento.
ObjectSe utiliza para documentos incrustados.
NullSe utiliza para crear valores nulos.
SymbolSímbolo (Symbol). Este tipo de dato es básicamente equivalente al tipo cadena, pero con la diferencia de que generalmente se usa en lenguajes que emplean un tipo de símbolo especial.
DateFecha y hora (Date). Almacena la fecha o hora actual en formato de tiempo UNIX. Puedes especificar tu propia fecha y hora: creando un objeto Date y pasando la información de año, mes y día.
Object IDObject ID. Se utiliza para crear el ID de un documento.
Binary DataDatos binarios (Binary data). Se utilizan para almacenar datos binarios.
CodeTipo Código (Code). Se utiliza para almacenar código JavaScript en el documento.
Regular expressionTipo Expresión regular (Regex). Se utiliza para almacenar expresiones regulares.

A continuación se explican varios tipos de datos importantes.

ObjectId

ObjectId es similar a una clave primaria única; se puede generar y ordenar rápidamente. Contiene 12 bytes, con el siguiente significado:

  • Los primeros 4 bytes representan la creaciónunixmarca de tiempo, hora de GreenwichUTChora, 8 horas detrás de la hora de Pekín
  • Los siguientes 3 bytes son el código de identificación de la máquina
  • Los dos bytes siguientes están compuestos por el ID de proceso (PID)
  • Los últimos tres bytes son un número aleatorio

Los documentos almacenados en MongoDB deben tener una clave _id. El valor de esta clave puede ser de cualquier tipo; por defecto es un objeto ObjectId.

Como ObjectId contiene la marca de tiempo de creación, no necesitas guardar un campo de marca de tiempo para tus documentos; puedes obtener el tiempo de creación del documento mediante la función getTimestamp:

> var newObject = ObjectId()
> newObject.getTimestamp()
ISODate("2017-11-25T07:21:10Z")

Convertir ObjectId a cadena

> newObject.str
5a1919e63df83ce79df8b38f

Cadena

Las cadenas BSON están codificadas en UTF-8.

Marca de tiempo

BSON tiene un tipo de marca de tiempo especial para uso interno de MongoDB, no relacionado con el tipo Fecha (Date) normal. El valor de la marca de tiempo es un valor de 64 bits. Donde:

  • Los primeros 32 bits son un valor time_t (los segundos transcurridos desde la época de Unix)
  • Los últimos 32 bits son un incremento de una operación dentro de un segundoordinal

En una instancia única de mongod, los valores de marca de tiempo suelen ser únicos.

En un conjunto de réplicas, el oplog tiene un campo ts. El valor de este campo representa el tiempo de la operación utilizando una marca de tiempo BSON.

El tipo de marca de tiempo BSON se utiliza principalmente para uso interno de MongoDB. En la mayoría de los casos de desarrollo de aplicaciones, puedes usar el tipo de fecha BSON.

Fecha

Representa los milisegundos transcurridos desde la época de Unix (1 de enero de 1970). El tipo de fecha está firmado; los números negativos representan fechas anteriores a 1970.

> var mydate1 = new Date()     //格林尼治时间
> mydate1
ISODate("2018-03-04T14:58:51.233Z")
> typeof mydate1
object
> var mydate2 = ISODate() //格林尼治时间
> mydate2
ISODate("2018-03-04T15:00:45.479Z")
> typeof mydate2
object

El tiempo creado de esta manera es de tipo fecha y se pueden usar los métodos del tipo Date de JS.

Devuelve una cadena de tipo tiempo:

> var mydate1str = mydate1.toString()
> mydate1str
Sun Mar 04 2018 14:58:51 GMT+0000 (UTC) 
> typeof mydate1str
string

o

> Date()
Sun Mar 04 2018 15:02:59 GMT+0000 (UTC)   
Otras extensiones