MongoDB.local SF, Jan 15: See the speaker lineup & ship your AI vision faster. Use WEB50 to save 50%
Find out more >
Menu Docs
Página inicial do Docs
/ /

Paginar os resultados

Em clusters que executam o MongoDB 7.0.5+, use o MongoDB Search para recuperar seus $search resultados da query sequencialmente antes ou depois de um ponto de referência . Use as opções $search searchAfter ou searchBefore para percorrer os resultados em ordem e criar as funções "Próxima página" e "Página anterior" em seu aplicação.

Para recuperar resultados paginados, execute as seguintes etapas:

  1. Crie um índice nos campos que você deseja consultar.

  2. Execute uma query $search que retorna um ponto de referência. Para saber mais, consulte Recuperar ponto de referência.

  3. Use o ponto de referência em sua query $search subsequente para recuperar o conjunto de documentos seguinte ou anterior nos resultados.

    • Para saber mais sobre como recuperar resultados para criar uma função "Próxima página", consulte Atlas Search após um ponto de referência específico.

    • Para saber mais sobre como recuperar resultados para criar uma função de "Página anterior", consulte Atlas Search antes de um ponto de referência específico.

    • Para ir para uma página em seus resultados, combine $skip e $limit com as opções $search searchAfter ou searchBefore. Por exemplo, para ir para os resultados da página 3 para a página 5, com 10 resultados por página, faça o seguinte:

      1. Recupere resultados usando searchAfter com o ponto de referência do último resultado na página 3 (Result 30).

      2. Use $skip para pular os resultados 10 na página 4 (Resultados 31-40) e $limit para limitar os resultados a 10 documentos.

      3. Retorne resultados para a página 5 (Resultados 41-50).

      Aqui, usar $skip com a opção searchAfter otimiza a query para pular apenas 1 página de resultados (10 documentos). Em comparação, se você usar $skip sem a opção $search searchAfter , a query pulará 4 páginas de resultados (40 documentos). Para aprender mais, veja Vá da página 2 para a página 5 usando searchAfter e $skip.

Um empate ocorre quando você classifica em um campo no qual vários documentos têm valores idênticos. O MongoDB não oferece garantias quanto à ordenação dos resultados de queries empatadas, o que pode levar à duplicação e inconsistência quando você usa searchAfter e searchBefore. Aplique os seguintes princípios para reduzir empates na pontuação de relevância:

  • Classifique sua query por um campo exclusivo para evitar empates na pontuação de relevância. Para um exemplo, consulte Classifique por pontuação e um campo único.

  • Se você quiser classificar principalmente por um campo não exclusivo, adicione uma cláusula de classificação secundária em um campo exclusivo para servir como desempate.

Atualizar ou excluir documentos entre queries pode causar inconsistências na ordem dos resultados. Aplique os seguintes princípios para o suporte ao comportamento de pesquisa determinística:

  • Classifique os resultados da query por um campo imutável , como _id. O MongoDB Search reflete as atualizações que você faz na sua coleção entre queries iniciais e posteriores. Se você classificar por um campo mutável, como updated_time e atualizar sua coleção entre a primeira e a segunda queries, o MongoDB Search poderá classificar os mesmos documentos de forma diferente.

  • Se você implantou nós de pesquisa dedicados e está classificando os resultados por searchScore, considere o seguinte:

    • Como padrão, o MongoDB Search pontua documentos usando o algoritmo de similaridade bm25, que calcula a frequência de termos em relação a todo o corpus de documentos no nó do MongoDB Search. Como cada nó do MongoDB Search replica o changestream de forma independente, esse corpus pode variar entre os nós do MongoDB Search. Como resultado, a mesma query pode retornar pontuações de bm25 diferentes quando roteada para nós do MongoDB Search diferentes. Queries subsequentes têm maior probabilidade de serem roteadas para nós do MongoDB Search diferentes se sua implantação usar nós do MongoDB Search dedicados, ou se sua preferência de leitura estiver definida como secondary ou nearest.

    • Para garantir pontuações consistentes em queries subsequentes, defina a propriedade similarity.type como stableTfl ou boolean ao indexar um campo como o tipo string ou autocompletar do MongoDB Search. Isso força os operadores text, phrase, queryString e autocomplete a usar o algoritmo de similaridade stableTfl ou boolean para calcular as pontuações de relevância para queries no campo indexado. Esses algoritmos calculam pontuações de forma consistente em todos os nós do MongoDB Search. Para saber mais, consulte Detalhes da pontuação.

Para recuperar resultados de query em um determinado ponto, você deve fornecer o ponto de referência em sua query $search . Você pode recuperar o ponto de referência usando a palavra-chave $meta searchSequenceToken no estágio $project após o estágio $search .

Sintaxe do searchSequenceToken
1[{
2 "$search": {
3 "index": "<index-name>",
4 "<operator-name>"|"<collector-name>": {
5 <operator-specification>|<collector-specification>
6 }
7 "sort": {
8 "score": {
9 "$meta": "searchScore"
10 }
11 },
12 ...
13 },
14 {
15 "$project": {
16 "paginationToken" : { "$meta" : "searchSequenceToken" }
17 },
18 ...
19}]

O searchSequenceToken gera um token codificado de Base64para cada documento nos resultados. O comprimento do token aumenta com o número de campos especificados na opção de classificação da sua query. O token não está vinculado a um snapshot do banco de dados.

Os documentos nos resultados são classificados na ordem padrão, a menos que você especifique a opção sort em sua query. Para saber mais sobre como classificar seus resultados, consulte Classificar resultados de pesquisa do MongoDB.

Para pesquisar um ponto de referência, você deve especificar o ponto de referência em sua query $search usando a opção searchAfter com o token gerado por searchSequenceToken. Você pode usar o token gerado por searchSequenceToken somente ao executar novamente a query $search para a qual searchSequenceToken gerou o token. A semântica (campos e valores de pesquisa) da query $search subsequente na qual você usa o token deve ser idêntica à query para a qual searchSequenceToken gerou o token.

Você pode utilizar a opção searchAfter para construir uma função "Próxima Página" em seu aplicativo. Para uma demonstração disso, consulte o exemplo nesta página.

Sintaxe searchAfter
1{
2 "$search": {
3 "index": "<index-name>",
4 "<operator-name>"|"<collector-name>": {
5 <operator-specification>|<collector-specification>
6 },
7 "searchAfter": "<base64-encoded-token>",
8 "sort": {
9 "score": {
10 "$meta": "searchScore"
11 }
12 },
13 ...
14 },
15 "$project": {
16 "paginationToken" : { "$meta" : "searchSequenceToken" }
17 },
18 ...
19}

A Pesquisa do MongoDB retorna os documentos nos resultados após o token especificado. O MongoDB Search retorna os tokens gerados para os documentos nos resultados porque você especificou o searchSequenceToken no estágio $project após o estágio $search (como mostrado na linha 11). Esses tokens podem ser usados como ponto de referência para outra query com a mesma semântica.

Os documentos nos resultados são classificados na ordem padrão, a menos que você especifique a opção sort em sua query. Para saber mais sobre como classificar seus resultados, consulte Classificar resultados de pesquisa do MongoDB.

Para o Atlas Search antes de um ponto de referência, você deve especificar o ponto de referência em sua query do $search utilizando a opção searchBefore com o token gerado pelo searchSequenceToken. Você pode usar o token gerado por searchSequenceToken somente quando executar novamente a query $search para a qual searchSequenceToken gerou o token. A semântica (campos e valores do Atlas Search ) da query subsequente do $search subsequente na qual você usa o token deve ser idêntica à query para a qual o searchSequenceToken gerou o token.

Você pode criar uma função "Página anterior" em seu aplicativo usando a opção searchBefore . Para criar uma função "Página anterior", combine o seguinte:

Para uma demonstração disso, veja exemplos de query searchBefore nesta página.

Sintaxe searchBefore
1{
2 "$search": {
3 "index": "<index-name>",
4 "<operator-name>"|"<collector-name>": {
5 <operator-specification>|<collector-specification>
6 },
7 "searchBefore": "<base64-encoded-token>",
8 "sort": {
9 "score": {
10 "$meta": "searchScore"
11 }
12 },
13 ...
14 },
15 "$project": {
16 "paginationToken" : { "$meta" : "searchSequenceToken" }
17 },
18 ...
19}

A Pesquisa do MongoDB retorna documentos nos resultados que precedem o token especificado em ordem inversa. O MongoDB Search também retorna os tokens gerados para os documentos nos resultados porque você especificou o searchSequenceToken no estágio $project após o estágio $search (como mostrado na linha 11). Esses tokens podem ser usados como ponto de referência para outra query com a mesma semântica.

Os exemplos a seguir usam a coleção sample-mflix.movies, que tem um índice do MongoDB Search chamado default com mapeamentos dinâmicos. Se você carregar a collection e criar o índice, poderá executar as seguintes queries na collection.

As queries demonstram como recuperar um ponto de referência, que é usado nas queries subsequentes para recuperar resultados adicionais para o mesmo termo antes e depois do ponto de referência especificado.

Estes exemplos demonstram como executar as seguintes tarefas:

  1. Obter a página 1 e gerar tokens de paginação

  2. Recupere a página 2 usando searchAfter

  3. Retorne à página 1 usando searchBefore

  4. Vá da página 2 para a página 5 usando searchAfter e $skip

  5. Usar faceta com os resultados paginados

Observação

Por padrão, o MongoDB Search classifica os documentos nos resultados pela pontuação de relevância dos documentos. Se vários documentos nos resultados tiverem pontuações idênticas, o MongoDB Search retornará resultados ordenados arbitrariamente. Para retornar documentos em uma ordem determinada, as queries especificam um campo único, released, para classificar os resultados.

Voltar

contar