Para agentes de IA: um índice de documentação está disponível em https://www.mongodb.com/pt-br/docs/llms.txt — as versões de markdown de todas as páginas estão disponíveis anexando .md a qualquer caminho de URL.

Executar queries de banco de dados nativos

Neste guia, você pode aprender como usar a MongoDB Extension para Hibernate ORM para executar query nativas em seu banco de dados MongoDB. Em vez da linguagem de query Hibernate (HQL) ou linguagem de query de persistência Jakarta (JPQL), as queries nativas permitem que você use a linguagem de query MongoDB (MQL) para especificar sua query. MQL é uma sintaxe de query projetada para interação com o modelo baseado em documento do MongoDB.

Dica

Linguagem de query do MongoDB

Para saber mais sobre a sintaxe e a funcionalidade do MQL, consulte Referência da linguagem de query do MongoDB no manual do MongoDB Server.

O método createQuery() do Hibernate ORM não suporta alguns recursos de query MongoDB. O método createNativeQuery() permite especificar queries de banco de dados no MQL e ignorar algumas limitações operacionais da extensão ORM do Hibernar.

Você também pode executar queries diretamente no seu objeto MongoClient para expandir a funcionalidade de query.

Os exemplos neste guia usam a entidade Movie, que representa a coleção sample_mflix.movies dos conjuntos de dados de amostra do Atlas. A entidade Movie tem a seguinte definição:

import com.mongodb.hibernate.annotations.ObjectIdGenerator;import org.bson.types.ObjectId;import java.util.List; import jakarta.persistence.Entity;import jakarta.persistence.Id;import jakarta.persistence.Table; @Entity@Table(name = "movies")public class Movie { @Id @ObjectIdGenerator private ObjectId id; private String title; private String plot; private int year; private int runtime; private List<String> cast; private List<String> directors; public Movie(String title, String plot, int year, int runtime, List<String> cast, List<String> directors) { this.title = title; this.plot = plot; this.year = year; this.runtime = runtime; this.cast = cast; this.directors = directors; } public Movie() { } public ObjectId getId() { return id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getPlot() { return plot; } public void setPlot(String plot) { this.plot = plot; } public int getYear() { return year; } public void setYear(int year) { this.year = year; } public int getRuntime() { return runtime; } public void setRuntime(int runtime) { this.runtime = runtime; } public List<String> getCast() { return cast; } public void setCast(List<String> cast) { this.cast = cast; } public List<String> getDirectors() { return directors; } public void setDirectors(List<String> directors) { this.directors = directors; }}

Para aprender como criar um aplicativo Java que use a Extensão MongoDB para Hibernate ORM para interagir com essa coleção de amostras do MongoDB, veja o tutorial Get Started.

Observação

Contextos de persistência

Para habilitar o ORM do Hibernate para interagir com o banco de dados, você deve executar operações dentro de um contexto de persistência utilizando um Hibernate Session ou um Jakarta Persistence EntityManager. Os exemplos neste guia usam um Session. Para saber mais sobre contextos de persistência, consulte o Transações e Sessões guia.

Para executar uma query nativa do MongoDB, especifique uma declaração de linguagem de query do MongoDB (MQL) que inclua a coleção a ser consultada e seus critérios de query em um pipeline de agregação.

Dica

Pipeline de agregação

Para saber mais sobre a construção de pipeline de agregação e a execução de operações de agregação, consulte a referência do pipeline de agregação no manual do MongoDB Server.

As declarações MQL têm o seguinte formato:

String mqlSyntax = """{ aggregate: "<collection to query>", pipeline: [ <aggregation pipeline stages> ]}""";

Importante

$ Requisitos de estágio do projeto

O pipeline de agregação em sua declaração MQL deve incluir um estágio $project. Para retornar os documentos de query como instância de entidade, você deve especificar cada campo de entidade no estágio $project, incluindo o campo _id. A extensão Hibernate ORM retorna os campo que você projeta e suprime _id quando você o omite. Uma query vinculada a entidade que omite _id pode falhar com Unknown column label [_id] porque o identificador da entidade mapeia para _id. Para manter o identificador disponível, projete _id: 1.

Em seguida, passe a declaração MQL para o método createNativeQuery().

Você pode usar queries nativas para executar as seguintes operações:

Importante

Sintaxe JSON estendida necessária

Você deve gravar query nativas no formato Extended JSON v2. A extensão Hibernate ORM não oferece suporte a aspas simples ou à sintaxe de expressão regular do shell do MongoDB Server (/pattern/) em query nativas. Por exemplo, para fazer uma query com uma expressão regular, use o tipo JSON estendido $regularExpression em vez de /pattern/.

Este exemplo executa uma query nativa na coleção sample_mflix.movies passando uma declaração MQL para o método createNativeQuery(). O código especifica as seguintes fases do pipeline de agregação:

  • $match: Filtros para documentos que têm um valor de campo de título de "The Parent Trap"

  • $sort: classifica os documentos correspondentes por seus year campos em ordem decrescente

  • $project: retorna cada campo de documento definido na entidade Movie

String nativeQuery = """{ aggregate: "movies", pipeline: [ { $match: { title: { $eq: "The Parent Trap" } } }, { $sort: { year: -1 } }, { $project: { _id: 1, title: 1, plot: 1, year: 1, runtime: 1, cast: 1 } } ]}"""; var results = session.createNativeQuery(nativeQuery, Movie.class) .getResultList(); for (Movie movie : results) { System.out.println("Title: " + movie.getTitle() + ", Year: " + movie.getYear());}

Observação

As query nativas são ideais para operações aritméticas que não são suportadas pela extensão do Hibernate ORM. Para aprender mais sobre quais operadores aritméticos a extensão Hibernate ORM suporta, consulte a seção Suporte a Query da página de Compatibilidade de recurso.

O exemplo a seguir executa uma query nativa na coleção sample_mflix.movies que executa as seguintes ações:

  • Especifica um estágio $match para corresponder a documentos que têm um valor de year maior que 2000 e um campo runtime que existe

  • Especifica um estágio $addFields para adicionar um novo campo chamado runtimeHours

  • Utiliza o operador aritmético $divide para converter o valor runtime de minutos para horas para o novo campo runtimeHours

  • Especifica um estágio $project para retornar cada campo de documento definido na entidade Movie, incluindo o campo _id

  • Imprime o valor title de cada documento atualizado

String nativeQuery = """{ aggregate: "movies", pipeline: [ { $match: { year: { $gt: 2000 }, runtime: { $exists: true } } }, { $addFields: { runtimeHours: { $divide: [ "$runtime", 60 ] } }}, { $project: { _id: 1, title: 1, plot: 1, year: 1, runtime: 1, cast: 1, runtimeHours: 1 }} ]}"""; var results = session.createNativeQuery(nativeQuery, Movie.class) .getResultList(); for (Movie result : results) { System.out.println("Added field to movie: " + result.getTitle());}

Dica

Operadores aritméticos

Para saber mais sobre os operadores aritméticos do Hibernate e do MongoDB, consulte os seguintes recursos:

Você pode executar queries nativas para realizar queries de pesquisa do MongoDB em seu banco de dados, que são pesquisas de texto refinadas em seus dados. Essas queries oferecem funcionalidade de pesquisa avançada, como correspondência de frases de texto, pontuação de resultados por relevância e realce de correspondências.

Importante

Você não pode executar uma query de pesquisa do MongoDB Search dentro de uma transação.

Para especificar uma query de pesquisa, crie um índice de pesquisa que abranja os campos em que você deseja fazer query. Em seguida, passe um pipeline de agregação para seu método createNativeQuery() que inclua um estágio $search ou $searchMeta.

Dica

MongoDB Search

Para saber mais sobre queries de pesquisa e índices do MongoDB, consulte Visão geral da pesquisa MongoDB no manual do MongoDB Server.

Este exemplo executa uma query de pesquisa passando o estágio de pipeline $search para o método createNativeQuery(). O código executa as seguintes ações:

  • Especifica o índice de pesquisa que cobre o campo plot. Certifique-se de substituir o espaço reservado <indexName> pelo seu nome de índice de pesquisa.

  • Queries de documentos cujos valores plot contêm a string "whirlwind romance" com não mais de 3 palavras entre eles

  • Especifica um estágio $project para retornar cada campo de documento definido na entidade Movie, incluindo o campo _id

  • Imprime os valores title e plot dos documentos correspondentes

String nativeQuery = """{ aggregate: "movies", pipeline: [ { $search: { index: "<indexName>", phrase: { path: "plot", query: "whirlwind romance", slop: 3 } } }, { $project: { _id: 1, title: 1, plot: 1, year: 1, runtime: 1, cast: 1 } } ]}"""; var results = session.createNativeQuery(nativeQuery, Movie.class) .getResultList(); for (Movie result : results) { System.out.println("Title: " + result.getTitle() + ", Plot: " + result.getPlot());}

Você pode usar parâmetros nomeados (:name) ou ordinais (?1) para especificar valores em sua declaração MQL. O exemplo a seguir demonstra como fornecer o valor do parâmetro title como um parâmetro nomeado ou ordinal e, em seguida, fornecer o valor do parâmetro com setParameter():

String nativeQuery = """{ aggregate: "movies", pipeline: [ { $match: { title: { $eq: :movieTitle } } }, { $sort: { year: -1 } }, { $project: { _id: 1, title: 1, plot: 1, year: 1, runtime: 1, cast: 1 } } ]}"""; var results = session.createNativeQuery(nativeQuery, Movie.class) .setParameter("movieTitle", "The Parent Trap") .getResultList(); for (Movie movie : results) { System.out.println("Title: " + movie.getTitle() + ", Year: " + movie.getYear());}

Se quiser executar operações de banco de dados que nem o método createQuery() nem o método createNativeQuery() suportem, você pode operar em um objeto MongoClient diretamente no seu aplicativo Java. Ao trabalhar com o MongoClient, você pode acessar a funcionalidade do MongoDB Java Sync Driver.

Dica

Suporte a recursos

Para saber mais sobre as funcionalidades do MongoDB não suportadas que você deve usar um objeto MongoClient para acessar, consulte a página Compatibilidade de funcionalidades.

Para aprender como usar o driver Java para a interação com o MongoDB, consulte a documentação do driver Java do MongoDB.

Você não pode usar a extensão ORM do Hibernar para criar índices em uma coleção, mas pode instanciar um MongoClient e usar o método createIndex() do driver Java . O seguinte código cria um índice de campo title na coleção sample_mflix.movies:

// Replace the <connection URI> placeholder with your MongoDB connection URIString uri = "<connection URI>";MongoClient mongoClient = MongoClients.create(uri);MongoDatabase db = mongoClient.getDatabase("sample_mflix");MongoCollection<Document> collection = db.getCollection("movies"); String indexResult = collection.createIndex(Indexes.ascending("title"));System.out.println(String.format("Index created: %s", indexResult));

Para saber mais sobre como usar o driver Java para criar índices, consulte o guia índices na documentação do driver Java.

Para saber mais sobre as linguagens de query discutidas neste guia, consulte os seguintes recursos: