sql >> Base de Datos >  >> NoSQL >> MongoDB

Obtener el ID del último documento insertado en MongoDB con el controlador Java

1. Resumen

A veces, necesitamos la identificación de un documento que acabamos de insertar en una base de datos MongoDB. Por ejemplo, es posible que deseemos devolver el ID como respuesta a una persona que llama o registrar el objeto creado para su depuración.

En este tutorial, veremos cómo se implementan los ID en MongoDB y cómo recuperar el ID de un documento que acabamos de insertar en una colección a través de un programa Java.

2. ¿Cuál es la identificación de un documento MongoDB?

Como todo sistema de almacenamiento de datos, MongoDB necesita un identificador único para cada documento almacenado en una colección. Este identificador es equivalente a la clave principal en las bases de datos relacionales.

En MongoDB, este ID se compone de 12 bytes:

  • un valor de marca de tiempo de 4 bytes representa los segundos desde la época de Unix
  • un valor aleatorio de 5 bytes generado una vez por proceso. Este valor aleatorio es único para la máquina y el proceso.
  • un contador incremental de 3 bytes

La ID se almacena en un campo llamado _id y es generado por el cliente. Esto significa que la identificación debe generarse antes de enviar el documento a la base de datos. Del lado del cliente, podemos usar una identificación generada por el controlador o generar una identificación personalizada.

Podemos ver que los documentos creados por el mismo cliente en el mismo segundo tendrán en común los primeros 9 bytes. Por lo tanto, la unicidad de la identificación se basa en el contador en este caso. El contador le permite a un cliente crear más de 16 millones de documentos en el mismo segundo.

Aunque comienza con una marca de tiempo, debemos tener cuidado de que el identificador no se use como criterio de ordenación. Esto se debe a que no se garantiza que los documentos creados en el mismo segundo se clasifiquen por fecha de creación, ya que no se garantiza que el contador sea monótono. Además, diferentes clientes pueden tener diferentes relojes de sistema.

El controlador de Java utiliza un generador de números aleatorios para el contador, que no es monótono. Es por eso que no debemos usar la ID generada por el controlador para ordenar por fecha de creación.

3. El Id. de objeto Clase

El identificador único se almacena en un ObjectId class que proporciona métodos convenientes para obtener los datos almacenados en el ID sin analizarlos manualmente.

Por ejemplo, así es como podemos obtener la fecha de creación de la ID:

Date creationDate = objectId.getDate();

Así mismo, podemos recuperar la marca de tiempo del ID en segundos:

int timestamp = objectId.getTimestamp();

El Id. de objeto class también proporciona métodos para obtener el contador, el identificador de la máquina o el identificador del proceso, pero todos están en desuso.

4. Recuperando la identificación

Lo principal a recordar es que, en MongoDB, el cliente genera el identificador único de un Documento antes de enviarlo al clúster. Esto contrasta con las secuencias en las bases de datos relacionales. Esto hace que la recuperación de esta identificación sea bastante fácil.

4.1. Identificación generada por el conductor

La forma estándar y fácil de generar la ID única de un Documento es dejar que el conductor haga el trabajo. Cuando insertamos un nuevo Documento a una Colección , si no hay _id el campo existe en el Documento , el controlador genera un nuevo ObjectId antes de enviar el comando de inserción al clúster.

Nuestro código para insertar un nuevo Documento en su colección puede verse así:

Document document = new Document();
document.put("name", "Shubham");
document.put("company", "Baeldung");
collection.insertOne(document);

Vemos que nunca indicamos cómo se debe generar el ID.

Cuando insertOne() método devuelve, podemos obtener el ObjectId generado del Documento :

ObjectId objectId = document.getObjectId("_id");

También podemos recuperar el ObjectId como un campo estándar del Documento y luego enviarlo a ObjectId :

ObjectId oId = (ObjectId) document.get("_id");

4.2. Identificación personalizada

La otra forma de recuperar el ID es generarlo en nuestro código y ponerlo en el Documento como cualquier otro campo. Si enviamos un Documento con un _id campo al controlador, no generará uno nuevo.

Es posible que necesitemos esto en algunos casos en los que necesitamos el ID del Documento de MongoDB antes de insertar el Documento en la Colección .

Podemos generar un nuevo ObjectId creando una nueva instancia de la clase:

ObjectId generatedId = new ObjectId();

O también podemos invocar el get() estático método del ObjectId clase:

ObjectId generatedId = ObjectId.get();

Luego, solo tenemos que crear nuestro Documento y use la identificación generada. Para ello, podemos facilitarlo en el Documento constructor:

Document document = new Document("_id", generatedId);

Alternativamente, podemos usar put() método:

document.put("_id", generatedId);

Al usar una identificación generada por el usuario, debemos tener cuidado de generar una nueva ObjectId antes de cada inserción, ya que las identificaciones duplicadas están prohibidas. Los ID duplicados darán como resultado una MongoWriteException con un mensaje clave duplicado.

El Id. de objeto class proporciona varios otros constructores que nos permiten establecer algunas partes del identificador:

public ObjectId(final Date date)
public ObjectId(final Date date, final int counter)
public ObjectId(final int timestamp, final int counter)
public ObjectId(final String hexString)
public ObjectId(final byte[] bytes)
public ObjectId(final ByteBuffer buffer)

Pero debemos tener mucho cuidado cuando usamos esos constructores, ya que la singularidad de la ID proporcionada al controlador depende completamente de nuestro código. Podemos obtener un error de claves duplicadas en estos casos particulares:

  • si usamos la misma combinación de fecha (o marca de tiempo) y contador varias veces
  • Si usamos la misma cadena hexadecimal , byte matriz, o ByteBuffer varias veces