Spring Data: Tutorial de MongoDB

    Visi贸n general

    Datos de Spring es un proyecto general que contiene muchos subm贸dulos, cada uno espec铆fico para una base de datos en particular. En este art铆culo, cubriremos Spring Data MongoDB mediante la creaci贸n de una aplicaci贸n que almacena y recupera datos de MongoDB, una base de datos NO-SQL basada en documentos.

    Si desea leer m谩s sobre Spring Data, lo hemos cubierto en detalle en – Gu铆a para Spring Data JPA.

    MongoDB

    MongoDB es una base de datos NoSQL orientada a documentos que almacena documentos similares a JSON con esquemas din谩micos. Se utiliza com煤nmente para el almacenamiento de datos de gran volumen.

    Antes de seguir adelante, ser铆a bueno conocer algunos de los t茅rminos de la base de datos NoSQL. Tenga en cuenta que estos t茅rminos no son exactamente uno a uno en comparaci贸n con las bases de datos SQL relacionales:

    • Base de datos: Es un contenedor de colecciones y puede considerarse similar a una base de datos RDBMS, que es un contenedor de tablas.
    • Colecci贸n: Es equivalente a Tablas en RDBMS, pero a diferencia de una colecci贸n, tiene un esquema din谩mico. Existe una colecci贸n dentro de una base de datos.
    • Documento: Es un registro 煤nico en una colecci贸n de MongoDB. Se puede considerar como una fila en RDBMS.
    • Campo: Un documento tiene cero o m谩s campos. Es como una columna RDBMS que tiene un par clave-valor.

    Para configurar el servidor MongoDB en su m谩quina local, puede descargar el archivo instalable aqu铆 seg煤n su sistema operativo. A continuaci贸n, tambi茅n puede descargar una herramienta como Br煤jula para una buena GUI para interactuar con su servidor.

    Otra opci贸n y la que usaremos es Atlas de MongoDB, que es una base de datos en la nube como servicio. Despu茅s de registrarse, inicie sesi贸n y cree un cl煤ster con el nivel gratuito:

    Para conectarnos a nuestro cl煤ster, tenemos que crear un usuario:

    Creemos ahora nuestra base de datos y colecci贸n:

    Ahora estamos configurados para conectarnos a nuestra colecci贸n usando nuestra aplicaci贸n Spring.

    Proyecto Spring Data MongoDB

    Preparar

    La mejor manera de comenzar con un proyecto esqueleto es visitar Spring Initializr. Seleccione su versi贸n preferida de Spring Boot y agregue el Web y MongoDB dependencias:

    Despu茅s de esto, generelo como un proyecto de Maven y 隆listo!

    Definici贸n de una colecci贸n

    Primero, definamos nuestra colecci贸n Candidate clase modelo:

    @Document(collection = "candidate")
    public class Candidate {
        @Id
        private String id;
    
        private String name;
    
        private double exp;
    
        @Indexed(unique = true)
        private String email;
    
        // getters and setters
    }
    

    Ahora echemos un vistazo a estas anotaciones:

    • @Documento: Esto marca la clase como un objeto de dominio que se conservar谩 en la base de datos. El nombre de colecci贸n predeterminado que se utiliza es el nombre de la clase (primer car谩cter en min煤sculas). Podemos mapear a una colecci贸n diferente en la base de datos usando el collection atributo de la anotaci贸n.
    • @Carn茅 de identidad: Esto marca el campo utilizado con fines de identidad.
    • @Indexed (煤nico = verdadero): Se aplica al campo que se indexar谩 con una restricci贸n de 煤nico.

    Definici贸n de repositorio

    Creamos un repositorio haciendo una interfaz:

    public interface CandidateRepository extends MongoRepository<Candidate, String> {}
    

    CandidateRepository extiende el MongoRepository interfaz y enchufa el tipo de datos del documento con el que estamos trabajando, es decir Candidate y String respectivamente.

    Esto nos dar谩 acceso a todas las operaciones CRUD en torno a la colecci贸n MongoDB.

    Configuraci贸n de la conexi贸n

    Para configurar una conexi贸n adecuada, necesitamos definir las propiedades de la conexi贸n en application.properties:

    spring.data.mongodb.uri=mongodb+srv://<USERNAME>:<PASSWORD>@<ClUSTER-NAME>-<INSTANCE-ID>/<DATABASE-NAME>?retryWrites=true
    

    Puede obtener estos valores directamente desde la interfaz de usuario de MongoDB Atlas:

    Nota: Si su contrase帽a contiene caracteres especiales, debe estar codificada como URL.

    De forma predeterminada, su cl煤ster est谩 protegido para no recibir solicitudes de ninguna IP de cliente. Necesitamos permitir que nuestra IP pueda conectarse a este cl煤ster a trav茅s de una lista blanca de IP:

    Definici贸n del controlador

    Ahora, usemos nuestro repositorio en nuestro CandidateController mediante el @Autowired anotaci贸n:

    @RestController
    @RequestMapping("/candidate")
    public class CandidateController {
    
        @Autowired
        private CandidateRepository candidateRepository;
    

    Operaciones CRUD simples

    Insertar

    Vamos a crear un POST mapeo que insertar谩 datos en nuestro MongoDB:

    @PostMapping
    @ResponseStatus(code = HttpStatus.CREATED)
    public Candidate add(@RequestBody Candidate candidate) {
        return candidateRepository.save(candidate);
    }
    

    Usamos el save() m茅todo en el candidateRepository objeto. los Candidate el objeto es capturado por @RequestBody y se utiliza directamente en el save() m茅todo.

    Si intentamos usar la misma ID de correo electr贸nico nuevamente, obtendremos un error de clave duplicada:

    Tambi茅n podemos comprobar el estado de nuestra colecci贸n en Atlas:

    Leer

    Creemos un par de GET mapeos para recuperar nuestros registros.

    @GetMapping
    public List<Candidate> getAll() {
        return candidateRepository.findAll();
    }
    
    @GetMapping(value = "/{id}")
    public Candidate getOne(@PathVariable String id) {
        return candidateRepository.findById(id)
            .orElseThrow(() -> new ResourceNotFoundException());
    }
    

    findAll() devolver谩 todos los registros en nuestra base de datos, mientras que el findById() El m茅todo devolver谩 un 煤nico registro basado en la ID pasada.

    Si el registro no est谩 presente, throws una excepci贸n de tiempo de ejecuci贸n personalizada. ResourceNotFoundException es una clase personalizada que regresa 404 estado si se lanza:

    @ResponseStatus(value = HttpStatus.NOT_FOUND)
    public class ResourceNotFoundException extends RuntimeException {
        public ResourceNotFoundException() {
        }
    }
    

    Si desea leer m谩s sobre esto, lo hemos cubierto en detalle en – Manejo de excepciones en Spring.

    Actualizar

    Ahora, para actualizar un registro en particular, usaremos un PUT cartograf铆a:

    @PutMapping(value = "/{id}")
    public Candidate update(@PathVariable String id, @RequestBody Candidate updatedCandidate) {
        Candidate candidate = candidateRepository.findById(id)
            .orElseThrow(() -> new ResourceNotFoundException());
        candidate.setName(updatedCandidate.getName());
        candidate.setExp(updatedCandidate.getExp());
        candidate.setEmail(updatedCandidate.getEmail());
        return candidateRepository.save(candidate);
    }
    

    Primero comprobamos si el Candidate con lo dado id est谩 presente o no. Si no, devolvemos un 404 estado, de lo contrario, actualizamos todo el objeto y lo guardamos usando el save() m茅todo:

    Eliminar

    Ahora, eliminemos un registro en particular mediante la DELETE cartograf铆a:

    @DeleteMapping(value = "/{id}")
    @ResponseStatus(code = HttpStatus.ACCEPTED)
    public void delete(@PathVariable String id) {
        Candidate candidate = candidateRepository.findById(id)
            .orElseThrow(() -> new ResourceNotFoundException());
        candidateRepository.delete(candidate);
    }
    

    Usamos el delete() m茅todo en el candidateRepository para borrar la entrada:

    M茅todos de consulta personalizados

    Podemos agregar algunos m茅todos a nuestro CandidateRepository para tener alguna funcionalidad adicional basada en nuestros requisitos comerciales:

    public interface CandidateRepository extends MongoRepository<Candidate, String> {
    
        Optional<Candidate> findByEmail(String email);
    
        List<Candidate> findByExpGreaterThanEqual(double exp);
    
        List<Candidate> findByExpBetween(double from, double to);
    }
    

    Arriba, agregamos la funcionalidad de b煤squeda basada en el correo electr贸nico y la experiencia. Todo lo que tenemos que hacer es seguir una convenci贸n de nomenclatura establecida por Datos de Spring.

    Despu茅s de la findBy() m茅todo escribimos el nombre del atributo en caso de camello, seguido de cualquier otra restricci贸n que queramos aplicar. Los argumentos del m茅todo deben coincidir con la expectativa de la cl谩usula where. Spring Data crear谩 consultas reales para usted durante el inicio de la aplicaci贸n utilizando esta interfaz.

    Usemos esto en nuestro controlador:

    @GetMapping("/searchByEmail")
    public Candidate searchByEmail(@RequestParam(name = "email") String email) {
        return candidateRepository.findByEmail(email)
            .orElseThrow(() -> new ResourceNotFoundException());
    
    }
    
    @GetMapping("/searchByExp")
    public List<Candidate> searchByExp(@RequestParam(name = "expFrom") Double expFrom, @RequestParam(name = "expTo", required = false) Double expTo) {
        List<Candidate> result = new ArrayList<>();
        if (expTo != null) {
            result = candidateRepository.findByExpBetween(expFrom, expTo);
        } else {
            result = candidateRepository.findByExpGreaterThanEqual(expFrom);
        }
        return result;
    }
    

    Conclusi贸n

    En este art铆culo, hemos cubierto c贸mo usar Spring Data MongoDB para conectarse a un servidor MongoDB. Primero creamos un servidor MongoDB en la nube usando MongoDB Atlas y luego usamos Spring Data para conectarnos a 茅l. Despu茅s de eso, realizamos una operaci贸n CRUD simple y escribimos algunas consultas personalizadas.

    Como siempre, el c贸digo de los ejemplos utilizados en este art铆culo se puede encontrar en Github.

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *