MongoDB almacena los registros de datos como documentos BSON. BSON es una representación binaria de Documentos JSON con tipos de datos adicionales. Para conocer la especificación de BSON, consulta bsonspec.org. Consulte también BSON Types.
Estructura del documento
Los documentos están compuestos por pares campo-valor y tienen la siguiente estructura:
{ field1: value1, field2: value2, field3: value3, ... fieldN: valueN }
El valor de un campo puede ser cualquiera de los tipos de datos BSON, incluidos otros documentos, arreglos y arreglos de documentos. Por ejemplo, el siguiente documento contiene valores de diversos tipos:
var mydoc = { _id: ObjectId("5099803df3f4948bd2f98391"), name: { first: "Alan", last: "Turing" }, birth: new Date('Jun 23, 1912'), death: new Date('Jun 07, 1954'), contribs: [ "Turing machine", "Turing test", "Turingery" ], views : Long(1250000) }
Los campos mencionados anteriormente tienen los siguientes tipos de datos:
_idcontiene un ObjectId.nameincluye un documento incrustado que incluye los camposfirstylast.birthydeathincluye valores del tipo fecha.contribscontiene un arreglo de strings.viewscontiene un valor del tipo NumberLong.
Nombres de campos
Los nombres de campo son cadenas con restricciones y requisitos específicos.
Restricciones generales
Las restricciones generales para los nombres de campo son:
Los nombres de campo no pueden contener el caracter
null.El servidor permite el almacenamiento de nombres de campo que contienen puntos (
.) y signos de dólar ($).MongodB 5.0 ofrece un mejor soporte para el uso de (
$) y (.) en los nombres de campo. Existen algunas restricciones. Consulta Consideraciones sobre los nombres de campo para obtener más detalles.
Requisitos de unicidad
Los nombres de los campos deben cumplir con los siguientes criterios de unicidad:
Cada nombre de campo debe ser único dentro del documento. No debes almacenar documentos con campos duplicados porque las operaciones CRUD de MongoDB podrían comportarse de manera inesperada si un documento tiene campos duplicados.
MongoDB no permite insertar documentos con nombres de campo duplicados. Si bien algunos compiladores BSON permiten la creación de dichos documentos, MongoDB no los admite, incluso si la inserción se realiza correctamente o parece hacerlo.
No se admite la actualización de documentos con nombres de campos duplicados, incluso si la actualización tiene éxito o parece tener éxito.
Por ejemplo, insertar un documento BSON con nombres de campos duplicados a través de un controlador de MongoDB puede resultar en que el controlador descarte silenciosamente los valores duplicados antes de la inserción, o puede resultar en que se inserte un documento inválido que contenga campos duplicados. Realizar un query en esos documentos lleva a resultados inconsistentes.
A partir de MongoDB 6.1, para ver si un documento tiene nombres de campo duplicados, utiliza el comando validate con el campo full establecido en true. En cualquier versión de MongoDB, utiliza el operador de agregación $objectToArray para ver si un documento tiene nombres de campo duplicados.
Nota
Para restricciones específicas del campo _id, consulta El campo _id.
Notación de puntos
MongoDB utiliza la notación de puntos para acceder a elementos de arreglos y campos de documentos embebidos.
Arreglos
Para especificar o acceder a un elemento de un arreglo por su posición de índice basada en cero, concatene el nombre del arreglo y la posición del índice basada en cero usando notación de puntos, y encierre el resultado entre comillas:
"<array>.<index>"
Por ejemplo, dado el siguiente campo en un documento:
{ ... contribs: [ "Turing machine", "Turing test", "Turingery" ], ... }
Para especificar el tercer elemento de la matriz contribs, utilice "contribs.2".
Para ver ejemplos de consultas a arreglos, visita:
Tip
$[]todos los operadores posicionales para las operaciones de actualización.$[<identifier>]operadores posicionales filtrados para operaciones de actualización.$operadores posicionales para operaciones de actualización.$operador de proyección cuando se desconoce la posición del índice del arreglo.Consulta un arreglo para obtener ejemplos de notación de puntos con arreglos.
Documentos incrustados
Para especificar o acceder a un campo de un documento incrustado, concatene el nombre del documento incrustado y el nombre del campo utilizando la notación de punto y encierre el resultado entre comillas:
"<embeddedDocument>.<field>"
Por ejemplo, dado el siguiente campo en un documento:
{ ... name: { first: "Alan", last: "Turing" }, contact: { phone: { type: "cell", number: "111-222-3333" } }, ... }
Para especificar el campo
lastenname, usa:"name.last".Para especificar el campo
numberen el documento anidadophone, utiliza:"contact.phone.number".
Advertencia
Los campos de partición no pueden utilizar nombres de campo que contengan un punto (.).
Para ejemplos de consultas de documentos incrustados, consulte:
Limitaciones de documentos
Los documentos MongoDB tienen ciertos atributos, como el tamaño del documento y el orden de los campos, que pueden afectar el comportamiento de la consulta y el rendimiento de la aplicación.
Límite de tamaño del documento
El tamaño máximo de un documento BSON es de 16 mebibytes.
El tamaño máximo del documento ayuda a garantizar que un solo documento no utilice una cantidad excesiva de RAM o un ancho de banda excesivo durante la transmisión. Para almacenar documentos más grandes que el tamaño máximo, MongoDB proporciona la API GridFS. Para obtener más información sobre GridFS, consulta la mongofiles y la documentación de tu controlador.
Orden de los campos del documento
Los campos en los documentos BSON están ordenados (a diferencia de los objetos JavaScript).
Orden de campos en las queries
Para queries, el comportamiento del orden de los campos es el siguiente:
El orden de los campos es significativo cuando se comparan documentos. Por ejemplo:
{a: 1, b: 1}es igual a{a: 1, b: 1}{a: 1, b: 1}no es igual a{b: 1, a: 1}
El motor de consultas puede reordenar los campos para una ejecución eficiente. Esta reordenación puede ocurrir en los resultados de consulta intermedios y finales, y puede ocurrir con los siguientes operadores de proyección:
Importante
Debido a que algunas operaciones pueden reordenar campos, no confíes en un orden específico de campos en los resultados de las consultas que utilizan los operadores de proyección anteriores.
Orden de campos en las operaciones de guardar
Para las operaciones de guardado, MongoDB conserva el orden de los campos del documento excepto en los siguientes casos:
El campo
_idsiempre es el primer campo del documento.Las actualizaciones que incluyen
renamingde los nombres de campo pueden resultar en el reordenamiento de los campos en el documento.
El campo _id
En MongoDB, cada documento almacenado en una colección estándar requiere un campo _id único que actúa como llave primaria. Si un documento insertado omite el campo _id, el controlador de MongoDB genera automáticamente un ObjectId para el campo _id.
Esto también se aplica a los documentos insertados mediante operaciones de actualización con inserción: true.
Nota
En colecciones de series de tiempo, los documentos no requieren un campo _id único porque MongoDB no crea un índice en el campo _id.
Comportamiento y restricciones:
Al crear una colección, MongoDB crea un índice único en
_idpor defecto.El campo
_idsiempre es el primero de un documento. Si el servidor recibe un documento que no tiene el campo_idprimero, lo mueve al principio del documento._idlos nombres de subcampo no pueden comenzar con un símbolo ($).El campo
_idpuede contener cualquier tipo de datos BSON excepto arreglo, regex o undefined.
Opciones comunes de valor _id:
A continuación se presentan opciones comunes para almacenar valores para el campo _id:
Utilice un ObjectId.
Utiliza un identificador único natural, si está disponible. Esto ahorra espacio y evita índices adicionales.
Genera un número que incrementa automáticamente.
Genera un UUID como un tipo BSON
BinDatapara un almacenamiento eficiente de UUIDs en la colección y el índice_id.Las claves de índice que son del tipo
BinDatase almacenan de manera más eficiente en el índice si:el valor del subtipo binario está en el rango de 0-7 o 128-135, y
la longitud del arreglo de bytes es: 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24 o 32.
Se debe usar la función BSON UUID del driver para generar UUID. Ten en cuenta que las implementaciones de drivers pueden implementar la lógica de serialización y deserialización de UUID de manera diferente, lo que puede no ser completamente compatible con otros drivers. Se debe consultar la documentación del driver para obtener información sobre la interoperabilidad de UUID.
Nota
La mayoría de los clientes del controlador de MongoDB incluyen el campo _id y generan un ObjectId antes de enviar la operación de inserción a MongoDB. Sin embargo, si el cliente envía un documento sin un campo _id, el mongod añade el campo _id y genera el ObjectId.
Otros usos de la estructura del documento
Además de definir registros de datos, MongoDB utiliza la estructura del documento en varios otros contextos, incluidas las operaciones de query y manipulación de datos.
Documentos de filtro de query
Los documentos de filtro de query especifican las condiciones para las operaciones de lectura, actualización y eliminación.
Puedes utilizar expresiones <field>:<value> para especificar la condición de igualdad y las expresiones del operador del query.
{ <field1>: <value1>, <field2>: { <operator>: <value> }, ... }
Para ver ejemplos, consulta:
Actualizar los documentos de especificación
Puedes utilizar los operadores de actualización para especificar modificaciones en los campos:
{ <operator1>: { <field1>: <value1>, ... }, <operator2>: { <field2>: <value2>, ... }, ... }
Para ejemplos, consulte Actualizar documentos en una colección.
Documentos de especificación de índice
Los documentos de especificación de índices definen los campos a indexar y sus tipos:
{ <field1>: <type1>, <field2>: <type2>, ... }