Spring Boot y MongoDB

De ChuWiki


Creación del proyecto Spring Boot y MongoDB[editar]

Hay muchas formas de crear el proyecto y podemos además utilzar herramientas como Gradle o Maven. Una de las formas de crear el proyecto es usar la web Initializr de Spring Boot. Esta web nos permite elegir versión de Spring Boot, versión de Java y si usamos Maven o Gradle.

En crear proyecto Maven con Spring Boot y MongoDB tienes los detalles para crear el proyecto que vamos a usar en este ejemplo y como configurarlo para que se conecte a tu base de datos MongoDB.

En spring-boot-mongodb tienes el código completo de ejemplo con todas las operaciones CRUD de consultas, inserción, modificación y borrado de docuemntos y POJO en MongoDB.

Opciones de conexión a MongoDB con Spring Boot[editar]

Una vez tenemos el proyecto, Spring Boot nos ofrece tres formas de acceso: MongoRepository, MongoTemplate y MongoClient. Veamos cómo están pensadas y qué diferencias, ventajas e inconvenientes hay entre unas y otras. Para esta conpartiva es importante tener en cuenta que, por defecto, Spring Boot establece una única conexión con un servidor de MongoDB y dentro de ese servidor, con una sola base de datos.

MongoRepository[editar]

No existe una clase MongoRepository, es sólo un nombre para englobar varias clases Repository de Spring Boot que tendemos que crearnos nosotros. Una por cada colección de MongoDB que queramos usar. Crearlas es fácil, ya que solo son interfaces que heredan de alguna de las interfaces que Spring Boot pone a nuestra disposición. Por ejemplo, de CRUDRepository. Spring Boot se encargará de generar el código por nosotros y de conectarlo a la base de datos de MongoDB por defecto o que esté configurada en el fichero application.properties.

MongoRepository es la opción de más alto nivel y por la que deberíamos optar. Usando esta opción, podríamos incluso cambiar nuestra base de datos MongoDB por una clase de datos relacional SQL de toda la vida sin necesidad de modificar el código, salvo quizás las anotaciones de las clases que queremos guardar en base de datos. Utilizaríamos los típicos métodos findAll(), findById(), save(), etc pasando como parámetro nuestro objeto Java.

El principal inconveniente viene del hecho que Spring Boot solo establece por defecto conexión con una única base de datos de MongoDB. Crearíamos una clase MongoRepository por cada colección de la base de datos de MongoDB que queramos usar. Pero tendríamos que hacer configuraciones extra si quisieramos usar otras bases de datos dentro del mismo servidor MongoDB o conectar con varios servidores MongoDB independientes, que no estén en cluster.

Otro inconveniente adicional es que las interfaces Repository tienen una serie de método limitados para consultas y borrados. Podemos añadir más métodos fácilmente para consultas o borrados más selectivos. Pero tenemos que tener previstos esos métodos. Esto es un inconveniente si las consultas, por ejemplo, las construye dinámicamente un uauario de nuestra aplicación.

En Ejemplo de MongoRepository con Spring Boot puedes ver un ejemplo explicado de las operaciones CRUD.

MongoTemplate[editar]

Spring Boot instancia por defecto una clase MongoTemplate. Esta instancia está conectada al servidor de MongoDB y a la base de datos que tengamos configurada en el fichero application.properties. Si no hay configuración de conexión a MongoDB en ese fichrero, se conectará por defecto a un MongoDB en localhost y con los parámetros por defecto.

MongoTemplate es la opción de nivel intermedio. Nos da más libertad a la hora de hacer operaciones CRUD con la base de datos MongoDB. Nos permite también conectarnos fácilmente a otras bases de datos dentro del mismo servidor MongoDB. Cada instancia de MongoTemplate sólo se conecta a un servidor de MongoDB. Por ello, tendriamos que instanciar manualmente y configurar más instancias de MongoTemplate quisieramos conectarnos a varios servidores MongoDB independientes, que no estén trabajando en cluster.

Los métodos CRUD que nos ofrece MongoTemplate son amplios. Por un lado, tiene métodos muy similares a MongoClient, por lo que podríamos manejar la conexión con MongoDB como si huberamos establecido la conexión manualmente, sin Spring Boot. Pero por otro lado nos ofrece métodos de más alto nivel que nos facilitan las operaciones CRUD y que permiten usar directamente POJO en vez de org.bson.Document.

Deberíamos usar esta opción si tenemos algunas operaciones con MongoDB complejas y que MongoRepository no nos permite hacer facilmente. Un ejemplo es el caso de consultas dinámicas a petición del usuario, que hemos comentado en el apartado anterior. No estamos obligados a usar una opción u otra. Podemos usar MongoRepository en nuestro proyecto salvo en aquellos casos puntuales en que MongoRepository no sea suficiente.

En Ejemplo de MongoTemplate con Spring Boot tienes un ejemplo de código explicado con las operaciones CRUD.

MongoClient[editar]

MongoClient es la clase que nos ofrece directamente el driver de MongoDB para Java. Spring Boot se encarga de instanciarlo con los valores de conexión por defecto o bien con los que tengamos configurados en el fichero application.properties.

MongoClient es la opción de más bajo nivel. No tiene mucho sentido usarla si estamos con Spring Boot, sobre todo porque MongoTemplate ofrece métodos prácticamente copia de MongoClient además de otros métodos útiles.

En Ejemplo de MongoClient con Spring Boot tienes un ejemplo de código explicado. No incluye todas las operaciones CRUD, solo algunas como ejemplo de cómo utilizar MongoClient en Spring Boot. El motivo es que el detalle de cómo usar MongoClient ya se explicó en Conectar Java con MongoDB - Ejemplo CRUD.