18 - Campo _id generado por MongoDB

Cuando creamos un documento podemos o no iniciar el campo _id, en la mayoría de los ejemplos hemos definido nosotros el campo _id y su valor, recordemos que no pueden repetirse.

Si no definimos nosotros el campo _id se genera en forma automática:

use base1
db.libros.drop()

db.libros.insertOne(
  {
     titulo: 'El aleph',
    autor: 'Borges',
    editorial: ['Siglo XXI','Planeta'],
    precio: 20,
    cantidad: 50 
  }
)
db.libros.insertOne(
  {
    titulo: 'Martin Fierro',
    autor: 'Jose Hernandez',
    editorial: ['Siglo XXI'],
    precio: 50,
    cantidad: 12
  }
)

db.libros.find()

Tenemos como resultado:

MongoDB generación automática del campo _id

El valor que se genera es de la clase ObjectId y tiene la característica de poder generarse con un valor único aunque se esté generando en servidores distintos.

Uno de los objetivos fundamentales de emplear MongoDB es poder tener servidores distribuidos, la posibilidad de definir una clave primaria única y no tener que comunicarse entre los servidores se resuelve utilizando la clase ObjectId.

No se puede generar un campo numérico autoincremental como en los gestores de bases de datos relacionales, esto obligaría a sincronizar dicho campo con otros servidores y generaría cuellos de botella y excesivo tráfico.

MongoDB fue diseñado para ser una base de datos distribuida, es fundamenta poder generar identificadores únicos en un entorno fragmentado con múltiples servidores.

Un objeto de la clase ObjectId requiere 12 bytes y representan:

  • Los primeros 4 bytes indican la cantidad de segundos desde el 1 de enero de 1970 (época unix)
    Cuando se ordena por el _id luego los documentos se encontrarán organizados según el tiempo que se lo insertó.

  • Los 3 bytes siguientes del ObjectId son un identificador único de la máquina en la que se generó, esto nos garantiza que los diferentes servidores no generarán ObjectId iguales.

  • Los 2 bytes siguientes evitan que haya colisiones de ObjectId en el mismo servidor, el mismo se genera con el Id del número de proceso que lo generó.

  • Los primeros 9 bytes de un ObjectId garantizan su unicidad en todas las máquinas y procesos durante un segundo. Los últimos 3 bytes son simplemente un contador incremental que es responsable de la unicidad dentro de un segundo en un solo proceso. Esto permite generar hasta 16.777.216 ObjectIds únicos por proceso en un solo segundo.