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.

Modificar Resultados da Query

Neste guia, você pode aprender a classificar, ignorar, limitar e agrupar os resultados de uma query usando a Extensão MongoDB para Hibernate ORM.

Você pode classificar os resultados da query pelo valor de um campo especificado usando a cláusula order by em sua declaração de query. Por padrão, a cláusula order by classifica documentos em ordem crescente. Para classificar documentos em ordem decrescente, anexe a palavra-chave desc ao nome do campo .

O exemplo a seguir recupera documentos correspondentes da coleção sample_mflix.movies e os classifica pelo campo year em ordem decrescente:

var sortResult = session.createQuery("from Movie where title = :t order by year desc", Movie.class) .setParameter("t", "Cinderella") .getResultList();for (var m : sortResult) { System.out.println("Title: " + m.getTitle() + ", Year: " + m.getYear());}

Você pode ignorar um número específico de documentos nos resultados da consulta encadeando o método setFirstResult() à consulta. Passe o número de documentos iniciais a serem ignorados como argumento para esse método.

O exemplo a seguir executa a mesma query do exemplo anterior, mas ignora o primeiro documento correspondente nos resultados:

var skipResult = session.createQuery("from Movie where title = :t order by year desc", Movie.class) .setParameter("t", "Cinderella") .setFirstResult(1) .getResultList();for (var m : skipResult) { System.out.println("Title: " + m.getTitle() + ", Year: " + m.getYear());}

Você pode limitar o número de documentos que sua query retorna encadeando o método setMaxResults() à query. Passe o número máximo de documentos para retornar como argumento para esse método.

O exemplo a seguir executa a mesma query que o exemplo de classificação, mas retorna até dois documentos correspondentes nos resultados:

var limitResult = session.createQuery("from Movie where title = :t order by year desc", Movie.class) .setParameter("t", "Cinderella") .setMaxResults(2) .getResultList();for (var m : limitResult) { System.out.println("Title: " + m.getTitle() + ", Year: " + m.getYear());}

Como alternativa, você pode usar uma cláusula limit em sua declaração HQL ou JPQL para restringir o número de documentos que sua query retorna, conforme mostrado no código a seguir:

var limitClauseResult = session.createQuery("from Movie where title = :t order by year desc limit 2", Movie.class) .setParameter("t", "Cinderella") .getResultList();

Você pode agrupar documentos que compartilham um valor em uma única linha de resultado usando a cláusula group by em sua declaração de query. A extensão Hibernate ORM traduz a cláusula group by para um estágio MongoDB $group, no qual cada chave de agrupamento se torna um subcampo do campo _id.

Importante

Requisito de chave de agrupamento

Cada campo que você referencia na cláusula select, having ou order by de uma query agrupada deve ser uma chave de agrupamento ou parte de uma. Se você referenciar um campo que o estágio $group não produz, a extensão Hibernate ORM lança um FeatureNotSupportedException.

Uma consulta agrupada também não pode usar SELECT DISTINCT. Para resumir somente os valores distintos de um campo, consulte Resumir valores distintos.

Para agrupar resultados pelo valor de um ou mais campos, liste os campos na cláusula group by. Para agrupar por vários campos, separe os nomes dos campos com vírgula.

Este exemplo executa as seguintes operações:

  • Recuperar documento que tenha um valor title de "Hairspray" da coleção sample_mflix.movies.

  • Agrupa os filmes pelo campo year, o que retorna uma linha para cada ano de lançamento distinto.

  • Classifica os resultados pelos seus valores year em ordem crescente.

var groupResult = session.createQuery( "select year from Movie where title = :title group by year order by year", Integer.class) .setParameter("title", "Hairspray") .getResultList();for (var year : groupResult) { System.out.println("Year: " + year);}

A extensão Hibernate ORM traduz esta query para o seguinte pipeline. A cláusula where torna-se um estágio $match que executar antes do agrupamento. A cláusula order by torna-se um estágio $sort que classifica na chave de agrupamento:

[ { "$match": { "title": { "$eq": "Hairspray" } } }, { "$group": { "_id": { "year": "$year" } } }, { "$sort": { "_id.year": 1 } }, { "$project": { "_id#year": "$_id.year", "_id": 0 } }]

Uma chave de agrupamento pode ser uma expressão computada em vez de uma referência de campo. A extensão Hibernate ORM armazena a expressão em um subcampo _id gerado chamado k<n>. Quando você grava a mesma expressão na cláusula select ou having, a extensão Hibernate ORM a resolve para esse subcampo em vez de recalculá-la.

A extensão Hibernate ORM corresponde a uma expressão com uma chave de agrupamento apenas quando você grava as duas de forma idêntica. Por exemplo, uma chave de year + 1 não corresponde a uma ocorrência de 1 + year.

Você também pode ordenar por uma chave de expressão computada. Grave a expressão na cláusula order by exatamente como você a grava na cláusula group by.

O exemplo a seguir agrupa documentos que têm um title de "Hairspray" pela década em que foram lançados e classifica os resultados em ordem crescente:

var groupExpressionResult = session.createQuery( "select year / 10 * 10 from Movie where title = :title group by year / 10 * 10 order by year / 10 * 10", Integer.class) .setParameter("title", "Hairspray") .getResultList();for (var decade : groupExpressionResult) { System.out.println("Decade: " + decade);}

A extensão Hibernate ORM traduz esta query para o seguinte pipeline, no qual os estágios $sort e $project lêem a chave de agrupamento de _id.k0 em vez de recalcular a expressão:

[ { "$match": { "title": { "$eq": "Hairspray" } } }, { "$group": { "_id": { "k0": { "$multiply": [ { "$toInt": { "$divide": [ "$year", 10 ] } }, 10 ] } } } }, { "$sort": { "_id.k0": 1 } }, { "$project": { "#c_1": "$_id.k0", "_id": 0 } }]

Você também pode selecionar uma expressão calculada que contenha uma chave de agrupamento. Nesse caso, a extensão Hibernate ORM agrupa pela chave e calcula a expressão a partir da chave no estágio $project.

Para aprender mais sobre expressões computadas, consulte a seção Usar expressões computadas no guia Especificar uma query.

Para remover grupos dos resultados, use a cláusula having. A extensão Hibernate ORM usa a cláusula having para filtro na chave de agrupamento. Você pode combinar várias condições usando os operadores and e or.

Este exemplo executa as seguintes operações:

  • Recupera os "Hairspray" filmes da coleção sample_mflix.movies.

  • Agrupa os filmes pelo campo year, o que retorna uma linha para cada ano de lançamento distinto.

  • Filtro os grupos para incluir apenas valores de year maiores que 2000.

  • Classifique os resultados por ano em ordem crescente.

var havingResult = session.createQuery( "select year from Movie where title = :title group by year having year > 2000 order by year", Integer.class) .setParameter("title", "Hairspray") .getResultList();for (var year : havingResult) { System.out.println("Year: " + year);}

A extensão Hibernate ORM traduz esta query para o seguinte pipeline. A cláusula where torna-se um estágio $match que executar antes do agrupamento. A cláusula having torna-se um segundo estágio $match que executa após o agrupamento e os filtros na chave de agrupamento:

[ { "$match": { "title": { "$eq": "Hairspray" } } }, { "$group": { "_id": { "year": "$year" } } }, { "$match": { "_id.year": { "$gt": 2000 } } }, { "$sort": { "_id.year": 1 } }, { "$project": { "_id#year": "$_id.year", "_id": 0 } }]

Para saber mais sobre como executar outras operações em seus dados do MongoDB, consulte o guia Operações CRUD.

Para saber mais sobre como usar HQL e JPQL para executar queries, consulte Um guia para a linguagem de query do Hibernate na documentação do Hibernate ORM.