Spring-data + Mongo: Secuencia autoincremental en MongoDB mediante un servicio de Spring


Introducción

En este post mostraré cómo asignar un valor de una secuencia incrementada de forma automática a un campo empleando una colección de mongo. Para ello emplearemos la misma técnica que se muestra en el tutorial de mongodb.com pero con métodos puramente Java.

Es importante reseñar que este valor no debería de emplearse como identificador único del documento, Mongo ya dispone de mejores métodos para asignar identificadores a documentos, y por lo general sería una mala práctica. Por otro lado, en sistemas distribuidos o en bases de datos con una enorme cantidad de documentos, tampoco debería de emplearse esta metodología.

Este sistema es útil cuando hay que asignar identificadores públicos o de fácil memorización para ser empleados por usuarios del sistema (números de facturas, número de proveedor, número de envío, etc.)

Código para actualizar una secuencia en MongoDB desde Java de forma segura

Colección de secuencias

Del mismo modo que se muestra en el tutorial mencionado, vamos a disponer de un @Document para cada una de las secuencias que utilicemos. En este documento se alojará el último valor de la secuencia utilizado para cada una de ellas.

Es decir, para la versión propuesta en notación JSON:

Vamos a crear la siguiente clase Java:

Por otro lado, crearemos un servicio de Spring que nos permitirá obtener el siguiente valor de cada una de las secuencias de forma segura.

Para ello, en el tutorial original se emplea la siguiente función Javascript:

Esta función la añadimos a un @Service de Spring que podemos emplear cuando guardemos el documento que hará uso de la secuencia:

La función anterior podría emplearse posteriormente en otro servicio o repositorio a la hora de guardar un documento (e.g. una factura):

Función findAndModify

La función principal que se está empleando es findAndModify() que modifica y devuelve un único documento . Es importante señalar que la función debería de aplicarse filtrando sobre un campo que permita seleccionar la secuencia de forma unívoca. En este caso, localizaremos la secuencia por “_id”.

El trozo de código new Update().inc(“value”,1) incrementará unitariamente el campo “value”.

La opción returnNew(true) hará que la función devuelva el nuevo documento en lugar del original.

La opción upsert(true) creará un nuevo documento si la secuencia indicada no existe previamente.

Descargar código fuente

Podéis encontrar un proyecto de muestra con el código mostrado en este tutorial que cuenta con un @RestController para recuperar valores de secuencias y un test unitario para comprobar que se generan y almacenan correctamente en el siguiente enlace:

https://github.com/marcnuri-demo/spring-mongo-sequences

Tweet about this on TwitterShare on FacebookShare on LinkedInShare on Google+Pin on PinterestEmail this to someone

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *