Construindo o aplicativo Quakus com MongoDB e Panache
Aasawari Sahasrabuddhe5 min read • Published Dec 03, 2024 • Updated Dec 03, 2024
SNIPPET
Avalie esse Início rápido
Construir aplicativos com estruturas e bibliotecas sempre torna o tarefa mais simples. E quem não curte uma vida simples quando se trata de construir aplicativos complicados? Quando se trata de aplicativos Java , a escolha do Spring Data como estrutura ajuda a reduzir o código boilerplate para definir as configurações. Semelhante ao Spring, para construir aplicativos Quartokus, você pode usar o Panache. O Panache é uma biblioteca específica do Quarkus que simplifica o desenvolvimento de sua camada de persistência baseada no Hibernar.
O Panache no Quartokus simplifica o acesso aos dados minimizando o código padrão com operações CRUD integradas e consultas seguras de tipo. Ele suporta os padrões Active Record e Repository, permitindo flexibilidade na arquitetura. O Panache está totalmente integrado ao Quartokus, aproveitando tempos de inicialização rápidos e um baixo impacto de memória, tornando-o ideal para ambientes nativos da nuvem e sem servidor. Ele também fornece paginação fácil, suporta queries dinâmicas e nomeadas e funciona perfeitamente com Hibername ORM e JPA, aumentando a produtividade e mantendo o código limpo e eficiente.
Neste tutorial, criaremos um aplicação Quartokus com o Panache para executar alguns CRUD básicos com agregações para mostrar a eficiência do trabalho com o Panache. A API permite que você execute operações CRUD básicas, como adicionar, atualizar, localizar e excluir livros. Também suporta agregação ao grupo e conta livros por gênero.
- Um IDE de sua escolha.
- Maven ou Gradle conforme a escolha.
Antes de entrarmos na parte real da implementação das APIs, vamos considerar duas das coisas mais importantes.
- Você pode criar seu cluster gratuito seguindo as etapas mencionadas na documentação ou usando um cluster existente.
- Crie um projeto Quartokus com Maven usando o comando abaixo.
1 mvn io. quarkus:quarkus-maven-plugin:create \ 2 -DprojectGroupId=io.quarkus.platform \ 3 -DprojectArtifactId=quarkus-bom \ 4 -DclassName="com.example.BookResource" \ 5 -Dpath="/books"
3. Agora, adicione as dependências abaixo ao pom.xml.
1 <dependencies> 2 <dependency> 3 <groupId>io.quarkus</groupId> 4 <artifactId>quarkus-arc</artifactId> 5 </dependency> 6 <dependency> 7 <groupId>io.quarkus</groupId> 8 <artifactId>quarkus-rest</artifactId> 9 </dependency> 10 <dependency> 11 <groupId>io.quarkus</groupId> 12 <artifactId>quarkus-rest-client-jackson</artifactId> 13 <version>3.16.2</version> 14 </dependency> 15 <dependency> 16 <groupId>io.quarkus</groupId> 17 <artifactId>quarkus-resteasy-reactive-jackson</artifactId> 18 <version>3.15.1</version> 19 </dependency> 20 <dependency> 21 <groupId>io.rest-assured</groupId> 22 <artifactId>rest-assured</artifactId> 23 <scope>test</scope> 24 </dependency> 25 26 <dependency> 27 <groupId>io.quarkus</groupId> 28 <artifactId>quarkus-mongodb-panache</artifactId> 29 </dependency> 30 31 </dependencies>
4. Crie o aplicação completo e baixe as dependências:
1 mvn clean install
Após configurar o projeto , a próxima etapa é adicionar os pontos de conexão da API. Neste tutorial, usaremos a coleção de livros do cluster Atlas . A classe de modelo no projeto Quartokus adicionará os campos dentro da coleção, e a próxima etapa será realizar operações na coleção.
A coleção de livros na coleção Atlas será parecida com o seguinte:
A coleção de livros na coleção Atlas será parecida com o seguinte:
1 { 2 _id: .. 3 title: .. 4 author: .. 5 genre: .. 6 year: .. 7 }
- Inserir um livro: o primeiro passo será inserir os documentos dentro da coleção. Para fazer isso, precisamos adicionar a função na classe de recurso no projeto. Uma classe de recursos é uma classe que implementa o PanacheRepository e fornece métodos para manipular entidades.
Adicione o código abaixo à classe de recurso, que injeta a classe de repositório para implementar os métodos e, em seguida, cria a chamada POST.
1 2 BookRepository bookRepository; 3 4 public Response addBook(Book book) { 5 bookRepository.persist(book); 6 return Response.status(Response.Status.CREATED).entity(book).build(); 7 }
Isso inseriria um documento simples de cada vez dentro da coleção.
A classe BookRepository com o código abaixo:
1 import com.quarkusWithPanache.model.Book; 2 import io.quarkus.mongodb.panache.PanacheMongoRepository; 3 import jakarta.enterprise.context.ApplicationScoped; 4 5 6 public class BookRepository implements PanacheMongoRepository<Book> { 7 }
- GoGravação emmassa : o método de inserção inserirá os documentos um a um dentro da coleção. Se houver centenas ou milhares de documentos, levará muito tempo para inserir os documentos. Para economizar tempo e recursos a cada chamada, a gravação em massa inserirá todos os documentos de uma só vez. Para fazer isso, adicione o código abaixo, que executará a inserção em massa.
1 2 3 public Response bulkAddBooks(List<Book> books) { 4 // Prepare documents for bulk write 5 List<Document> documents = new ArrayList<>(); 6 for (Book book : books) { 7 documents.add(new Document("title", book.title) 8 .append("author", book.author) 9 .append("genre", book.genre) 10 .append("year", book.year)); 11 } 12 getCollection().insertMany(documents); 13 14 return Response.status(Response.Status.CREATED).entity(books).build(); 15 }
O método getCollection retorna o nome do banco de dados de dados e da collection de import com.mongodb. cliente.MongoCollection pacote.
- Encontrar todos os livros: Depois que todos os livros forem inseridos na coleção, o próximo passo é recuperar os documentos da coleção. Para obter todos os livros, crie a chamada de API abaixo como:
1 2 public List<Book> getAllBooks() { 3 return bookRepository.listAll(); 4 }
- Encontrar um livro por ID: para recuperar um livro específico da coleção com base no _id, a chamada da API abaixo buscaria um único documento que correspondesse à condição.
1 2 3 public Book getBookById( String id) { 4 return bookRepository.findById(new ObjectId(id)); 5 }
- Excluir livro por ID: semelhante à recuperação de um único documento da coleção, a exclusão excluirá o único documento com base no _id correspondente. Para fazer isso, use a API criada abaixo.
1 2 3 public Response deleteBook( String id) { 4 boolean deleted = bookRepository.deleteById(new ObjectId(id)); 5 return deleted ? Response.noContent().build() : Response.status(Response.Status.NOT_FOUND).build(); 6 }
- Atualizar um livro: por fim, para atualizar o documento com base no valor _id, use o código abaixo com os valores de campo atualizados.
1 2 3 public Response updateBook( String id, Book book) { 4 Book entity = bookRepository.findById(new ObjectId(id)); 5 if (entity == null) { 6 return Response.status(Response.Status.NOT_FOUND).build(); 7 } 8 entity.title = book.title; 9 entity.author = book.author; 10 entity.genre = book.genre; 11 entity.year = book.year; 12 bookRepository.update(entity); 13 return Response.ok(entity).build(); 14 }
- Agregação (contagem de gênero): além de executar operações CRUD básicas, se desejar executar uma operação de agregação , você pode usar o código abaixo. Como exemplo, essa agregação apresentará um campo de gênero e contará os gêneros.
1 2 3 public Response countBooksByGenre() { 4 5 List<Document> pipeline = new ArrayList<>(); 6 pipeline.add(new Document("$group", new Document("_id", "$genre") 7 .append("count", new Document("$sum", 1)))); 8 9 List<Document> result = getCollection() 10 .aggregate(pipeline) 11 .into(new ArrayList<>()); 12 13 return Response.ok(result).build(); 14 }
Para testar a API, podemos usar os seguintes
cURL
comandos para interagir com o servidor. Certifique-se de que o aplicação esteja em execução em http://localhost:8080
antes de enviar as solicitações.1 curl -X POST "http://localhost:8080/books" -H "Content-Type: application/json" -d '{ 2 "title": "Quarkus in Action", 3 "author": "John Doe", 4 "genre": "Programming", 5 "year": 2023 6 }'
1 curl -X POST http://localhost:8080/books/bulk \ 2 -H "Content-Type: application/json" \ 3 -d '[ 4 { 5 "title": "The Midnight Library", 6 "author": "Matt Haig", 7 "genre": "Fiction", 8 "year": 2020 9 }, 10 { 11 "title": "Sapiens: A Brief History of Humankind", 12 "author": "Yuval Noah Harari", 13 "genre": "Non-Fiction", 14 "year": 2011 15 }, 16 ....... 17 ]'
1 curl -X GET "http://localhost:8080/books" | jq
Encontrar um livro:
1 curl -X GET "http://localhost:8080/books/672f873b421eaa0c3e4da49f" | jq
1 curl -X DELETE "http://localhost:8080/books/673f81b65750de0757a4bbfb" | jq
1 curl -X PUT "http://localhost:8080/books/672f856f421eaa0c3e4da49e" \ 2 -H "Content-Type: application/json" \ 3 -d '{ 4 "title": "Quarkus in Action", 5 "author": "John Doe", 6 "genre": "Programming", 7 "year": 2021 8 }'
1 curl -X GET "http://localhost:8080/books/aggregate/genre-count" | jq
Isso daria a saída para a contagem de todos os gêneros.
O código completo do aplicação está disponível no Github repositório do Github.
Neste tutorial, exploramos como aproveitar o poder do Panache em um aplicação Quandokus para simplificar as operações CRUD e implementar consultas de agregação . Ao aproveitar as funcionalidades integradas do Panache, reduzimos o código padrão, tornando o desenvolvimento mais rápido e eficiente. Desde a inserção de um único e vários documentos até a recuperação, atualização e exclusão deles, demonstramos como o Panache se integra perfeitamente ao MongoDB para lidar com operações de dados. Além disso, mostramos como realizar agregações, como contar livros por gênero, para extrair insights significativos dos dados.
A capacidade da Panache de trabalhar com o Hibernar ORM e o JPA, combinada com o baixo espaço ocupado pela memória e os tempos de inicialização rápidos do Query, a torna a escolha ideal para criar aplicativos nativos da nuvem, sem servidor e de alto desempenho. Com o Panache, os desenvolvedores podem se concentrar na lógica de negócios enquanto mantêm o código limpo e legível.
Se você quiser saber mais sobre o MongoDB e seus conceitos, como pesquisa vetorial, leia nosso tutorial sobre Vector Search do MongoDB com Quartokus no Centro do programador MongoDB e encontre tópicos mais interessantes. Para quaisquer perguntas relacionadas aos itens acima ou MongoDB, não se lembre de fazer uma visita ao fórum da comunidade MongoDB e fazer parte de uma discussão interessante.
Principais comentários nos fóruns
Ainda não há comentários sobre este artigo.