Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
MongoDB Branding Shape
Click here >
Docs Menu

Paginar los resultados

En clústeres que ejecutan MongoDB 7.0.5+ utilice MongoDB Search para recuperar los resultados de la query $search secuencialmente antes o después de un punto de referencia. Use las opciones $search searchAfter o searchBefore para recorrer los resultados en orden y compilar funciones de "Página siguiente" y "Página anterior" en la aplicación.

Para recuperar resultados paginados, realiza los siguientes pasos:

  1. Crea un índice en los campos que deseas consultar.

  2. Ejecute una consulta que devuelva un punto de referencia. Para obtener más información, consulte $search Recuperarpunto de referencia.

  3. Utiliza el punto de referencia en tu query $search posterior para recuperar el conjunto de documentos anterior o siguiente de los resultados.

    • Para obtener más información sobre cómo recuperar resultados para crear una función de "Página siguiente", consulte la sección "Búsqueda después de un punto de referencia específico".

    • Para obtener más información sobre cómo recuperar resultados para crear una función de "Página anterior", consulte la sección "Búsqueda antes de un punto de referencia específico".

    • Para saltar a una página en tus resultados, combina $skip y $limit con $search opciones de searchAfter o searchBefore. Por ejemplo, para ir a los resultados de la página 3 a la página 5, con 10 resultados por página, haz lo siguiente:

      1. Recupera los resultados usando searchAfter con el punto de referencia para el último resultado en la página 3 (Resultado 30).

      2. Utiliza $skip para omitir los resultados de 10 en la página 4 (Resultados 31-40) y $limit para limitar los resultados a 10 documentos.

      3. Devuelve los resultados de la página 5 (resultados 41-50).

      Aquí, usar con $skip la searchAfter opción optimiza la consulta para omitir solo 1 páginas de resultados (10 documentos). En comparación, si usa $skip sin la $search searchAfter opción, la consulta omite 4 páginas de resultados (40 documentos). Para obtener más información, consulte Saltar de la página 2 a la página 5 usando searchAfter y $skip.

  • Se produce una coincidencia al ordenar un campo para el que varios documentos tienen valores idénticos. MongoDB no garantiza el orden de los resultados de las queries vinculadas, lo que puede generar duplicaciones e incoherencias al usar searchAfter y searchBefore. Aplicar los siguientes principios para reducir las coincidencias en la puntuación de relevancia:

    • Ordene la query por un campo único para evitar coincidencias en la puntuación de relevancia. Hay un ejemplo en Ordenar por puntuación y un campo único.

    • Si deseas ordenar principalmente por un campo no único, agrega una cláusula de clasificación secundaria en un campo único que sirva como desempate.

  • Actualizar o borrar documentos entre queries puede causar incoherencias en el orden de los resultados. Se deben aplicar los siguientes principios para respaldar el comportamiento de búsqueda determinista:

    • Ordene los resultados de la query por un campo inmutable, como _id. MongoDB Search refleja las actualizaciones que se realizan en la colección entre las queries iniciales y posteriores. Si se ordena por un campo mutable, como updated_time, y se actualiza la colección entre la primera y la segunda query, MongoDB Search podría ordenar los mismos documentos de otra manera.

    • Si se implementaron nodos de búsqueda dedicados y está ordenando los resultados por searchScore, considere lo siguiente:

      • Por defecto, MongoDB Search clasifica los documentos utilizando el algoritmo de similitud bm25, que calcula la frecuencia de los términos en relación con todo el corpus de documentos del nodo de MongoDB Search. Como cada nodo de MongoDB Search se replica independientemente desde el flujo de cambios, este corpus puede variar entre los nodos de MongoDB Search. Como resultado, la misma query puede devolver diferentes puntuaciones bm25 cuando se dirige a diferentes nodos de MongoDB Search. Las queries posteriores tienen más probabilidades de enrutarse a diferentes nodos de MongoDB Search si la implementación utiliza nodos dedicados de MongoDB Search o si la preferencia de lectura está configurada en secondary o nearest.

      • Para asegurar puntuaciones coherentes en queries posteriores, configure la propiedad similarity.type en stableTfl o boolean al indexar un campo como el tipo autocompletar o string de MongoDB Search. Esto obliga a los operadores de texto, frase, queryString y autocompletar a utilizar el algoritmo de similitud stableTfl o boolean para calcular las puntuaciones de relevancia de las query en el campo indexado. Estos algoritmos calculan las puntuaciones de forma coherente en todos los nodos de MongoDB Search. Hay más información en Detalles de la puntuación.

  • Para contar los resultados de búsqueda durante la paginación, utiliza la opción count en la $search query inicial o en una $searchMeta query separada. Este método es más eficiente que usar la etapa $count después de tu etapa $search.

    La opción count devuelve el número total de documentos que coinciden con tus criterios de búsqueda, así que no es necesario usar la opción count en queries posteriores si estás generando resultados paginados. Para mantener el conteo separado de la consulta principal $search, utilice una etapa $searchMeta con la opción count.

    Contar los resultados de una búsqueda puede afectar el rendimiento. Usa la opción contar sólo cuando sea necesario, por ejemplo, al obtener resultados de búsqueda para la primera página.

Para recuperar los resultados de la query en un punto determinado, debes proporcionar el punto de referencia en tu query $search. Puedes recuperar el punto de referencia utilizando la $meta palabra clave searchSequenceToken en la $project etapa después de tu $search etapa.

Sintaxis de 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}]

searchSequenceToken genera un token codificado en Base64 para cada documento en los resultados. La longitud del token aumenta con la cantidad de campos especificados en la opción de orden de la query. El token no está vinculado a un snapshot de la base de datos.

Los documentos de los resultados emplean el orden por defecto, a menos que se especifique la opción sort en la consulta. Para aprender sobre cómo ordenar tus resultados, consulte Ordenar resultados de MongoDB Search.

Para buscar un punto de referencia, debes especificar el punto de referencia en tu $search query utilizando la opción searchAfter con el token generado por searchSequenceToken. Puedes utilizar el token generado por searchSequenceToken solo cuando vuelvas a ejecutar la $search query para la que searchSequenceToken generó el token. La semántica (campos y valores de búsqueda) de la $search query posterior en la que utilices el token debe ser idéntica a la query para la que searchSequenceToken generó el token.

Puedes usar la searchAfter opción para crear una función de "Página siguiente" en tu aplicación. Para ver un ejemplo, consulta esta página.

Sintaxis de 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}]

MongoDB Search devuelve los documentos en los resultados después del token especificado. MongoDB Search devuelve los tokens generados para los documentos en los resultados porque se ha especificado searchSequenceToken en la etapa $project después de la etapa $search (como se muestra en la línea 11). Estos tokens se pueden utilizar como punto de referencia para otra query con la misma semántica.

Los documentos de los resultados emplean el orden por defecto, a menos que se especifique la opción sort en la consulta. Para aprender sobre cómo ordenar tus resultados, consulte Ordenar resultados de MongoDB Search.

Para buscar antes de un punto de referencia, tienes que especificar el punto de referencia en tu $search query utilizando la opción searchBefore con el token generado por searchSequenceToken. Puedes usar el token generado por searchSequenceToken solo cuando vuelvas a ejecutar la $search query para la que searchSequenceToken generó el token. La semántica (campos y valores de búsqueda) de la $search query posterior en la que uses el token debe ser idéntica a la query para la que searchSequenceToken generó el token.

Puedes usar la opción searchBefore para compilar una función de "Página anterior" en tu aplicación. Para ello, combine lo siguiente:

Para una demostración de esto, consulte los searchBefore ejemplos de consulta en esta página.

Sintaxis de 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}]

MongoDB Search devuelve los documentos en los resultados que preceden al token especificado en orden inverso. MongoDB Search también devuelve los tokens generados para los documentos en los resultados porque se especificó searchSequenceToken en la etapa $project después de la etapa $search (como se muestra en la línea 11). Estos tokens se pueden utilizar como punto de referencia para otra query con la misma semántica.

Los siguientes ejemplos utilizan el método db.collection.aggregate() para ejecutar consultas$search en la base de datos sample_mflix. El primer ejemplo de query muestra cómo recuperar un punto de referencia, que se utiliza en las queries de ejemplo posteriores para recuperar resultados adicionales de las páginas anteriores o posteriores al punto de referencia.

Para ejecutar estas consultas de ejemplo en mongosh:

  1. Cargar la colección sample_mflix.movies

  2. Crea el índice pagination-tutorial con mapeos dinámicos. Para aprender cómo crear un índice, consulte Administración de índices MongoDB Search

  3. Conéctate al clúster utilizando mongosh y pasa a la base de datos sample_mflix

Nota

Por defecto, MongoDB Search ordena los documentos de los resultados por la puntuación de relevancia de los documentos. Si varios documentos en los resultados tienen puntuaciones idénticas, MongoDB Search devuelve los resultados ordenados arbitrariamente. Para devolver los documentos en un orden determinado, las queries especifican un campo único, released, para ordenar los resultados.

Recupere los resultados de la primera página y los tokens o un punto de referencia para las queries posteriores.

La query de muestra utiliza las siguientes etapas del pipeline para recuperar resultados de la primera página y recuperar tokens o un punto de referencia para las query posteriores:

etapa de pipeline
Descripción
  • Busca títulos que contengan summer en el campo title usando el operador de texto.

  • Ordena los resultados por el valor del campo released en orden ascendente usando la opción de ordenar.

Limita los resultados a 10 documentos.

Solo incluye los campos title, released y genres de los documentos de los resultados. La query también agrega los siguientes campos a cada documento en los resultados:

  • paginationToken, que es el token que se puede utilizar como punto de referencia en las query posteriores

  • score, que es la puntuación de relevancia del documento en los resultados

db.movies.aggregate([
{
"$search": {
"index": "pagination-tutorial",
"text": {
"path": "title",
"query": "summer"
},
"sort": { "released": 1 }
}
},
{
"$limit": 10
},
{
"$project": {
"_id": 0,
"title": 1,
"released": 1,
"genres": 1,
"paginationToken": { "$meta" : "searchSequenceToken" },
"score": { "$meta": "searchScore" }
}
}
])
[
{
genres: [ 'Drama' ],
title: "A Summer at Grandpa's",
paginationToken: 'CKUdGgJgAA==',
score: 2.262615203857422
},
{
genres: [ 'Musical', 'Romance' ],
title: 'Summer Stock',
released: ISODate('1951-01-22T00:00:00.000Z'),
paginationToken: 'CJsFGgkpAHw/0HT///8=',
score: 3.000213623046875
},
{
genres: [ 'Comedy', 'Romance' ],
title: 'Smiles of a Summer Night',
released: ISODate('1957-12-23T00:00:00.000Z'),
paginationToken: 'CKIHGgkpAKDlpaf///8=',
score: 2.0149309635162354
},
{
genres: [ 'Drama' ],
title: 'Violent Summer',
released: ISODate('1959-11-13T00:00:00.000Z'),
paginationToken: 'CI8JGgkpAJhJh7X///8=',
score: 3.000213623046875
},
{
genres: [ 'Drama', 'Romance' ],
title: 'A Summer Place',
released: ISODate('1959-11-18T00:00:00.000Z'),
paginationToken: 'CLoJGgkpAGQJobX///8=',
score: 2.579726457595825
},
{
genres: [ 'Drama' ],
title: 'The End of Summer',
released: ISODate('1962-02-01T00:00:00.000Z'),
paginationToken: 'CK0KGgkpAAzP18X///8=',
score: 2.262615203857422
},
{
genres: [ 'Drama', 'Romance' ],
title: 'Summer and Smoke',
released: ISODate('1962-04-01T00:00:00.000Z'),
paginationToken: 'CMQKGgkpAECmB8f///8=',
score: 2.579726457595825
},
{
genres: [ 'Documentary', 'Sport' ],
title: 'The Endless Summer',
released: ISODate('1968-08-17T00:00:00.000Z'),
paginationToken: 'CO4MGgkpAJjH5vX///8=',
score: 2.579726457595825
},
{
genres: [ 'Comedy', 'Drama', 'Romance' ],
title: "Summer of '42",
released: ISODate('1971-04-09T00:00:00.000Z'),
paginationToken: 'CPQQGgkpAGRgUAkAAAA=',
score: 2.579726457595825
},
{
genres: [ 'Drama' ],
title: 'That Certain Summer',
released: ISODate('1972-11-01T00:00:00.000Z'),
paginationToken: 'COwRGgkpAPQV0hQAAAA=',
score: 2.579726457595825
}
]

Nota

Contar resultados de búsqueda

Para contar los resultados de búsqueda durante la paginación, ejecuta una $searchMeta query separada con la opción count. Esto devuelve un documento de metadatos que contiene el recuento total de documentos que coinciden con tus criterios de búsqueda.

La siguiente query de muestra obtiene el número total de documentos con el término summer en el campo title:

db.movies.aggregate([
{
"$searchMeta": {
"index": "pagination-tutorial",
"text": {
"path": "title",
"query": "summer"
},
"count": {
"type": "lowerBound",
"threshold": 5000
}
}
}
])
[ { count: { lowerBound: Long("65") } } ]

Recupere los resultados para compilar una función como "Página siguiente" en la aplicación.

Para recuperar más resultados, es necesario especificar el punto de referencia después del cual se desea recuperar los resultados.

La consulta de ejemplo utiliza las siguientes etapas de la canalización para recuperar resultados para la segunda página utilizando el token generado por searchSequenceToken de la consulta anterior para el mismo término:

etapa de pipeline
Descripción
  • Busca títulos que contengan summer en el campo title usando el operador de texto.

  • Devuelve los documentos posteriores al décimo documento de los resultados utilizando la opción searchAfter con el token de paginación asociado al décimo documento en los resultados de la query que ejecutaste para Recuperar la página 1 y generar tokens de paginación.

  • Ordena los resultados por el valor del campo released en orden ascendente usando la opción de ordenar.

Limita los resultados a 10 documentos.

Solo incluye los campos title, released y genres de los documentos de los resultados. También añade los siguientes campos a cada documento de los resultados:

  • paginationToken, que es el token que puedes usar como punto de referencia en las query posteriores

  • score, que es la puntuación de relevancia del documento en los resultados

db.movies.aggregate([
{
"$search": {
"index": "pagination-tutorial",
"text": {
"path": "title",
"query": "summer"
},
"searchAfter": "COwRGgkpAPQV0hQAAAA=",
"sort": { "released": 1 }
}
},
{
"$limit": 10
},
{
"$project": {
"_id": 0,
"title": 1,
"released": 1,
"genres": 1,
"paginationToken" : { "$meta" : "searchSequenceToken" },
"score": { "$meta": "searchScore" }
}
}
])
[
{
genres: [ 'Drama' ],
title: 'Summer Wishes, Winter Dreams',
released: ISODate('1974-09-09T00:00:00.000Z'),
paginationToken: 'CMwSGgkpAECHcCIAAAA=',
score: 2.262615203857422
},
{
genres: [ 'Drama', 'Thriller' ],
title: 'Shadows of a Hot Summer',
released: ISODate('1978-09-01T00:00:00.000Z'),
paginationToken: 'CPEVGgkpAGw/qz8AAAA=',
score: 2.0149309635162354
},
{
genres: [ 'Drama' ],
title: 'Indian Summer',
released: ISODate('1978-11-01T00:00:00.000Z'),
paginationToken: 'CNYRGgkpAFhj5UAAAAA=',
score: 3.000213623046875
},
{
genres: [ 'Drama' ],
title: 'Indian Summer',
released: ISODate('1978-11-01T00:00:00.000Z'),
paginationToken: 'CNsRGgkpAFhj5UAAAAA=',
score: 3.000213623046875
},
{
genres: [ 'Drama', 'Mystery' ],
title: 'One Deadly Summer',
released: ISODate('1983-05-11T00:00:00.000Z'),
paginationToken: 'COwcGgkpAAjtIGIAAAA=',
score: 2.579726457595825
},
{
genres: [ 'Comedy' ],
title: 'Summer Rental',
released: ISODate('1985-08-09T00:00:00.000Z'),
paginationToken: 'CL8fGgkpABTypHIAAAA=',
score: 3.000213623046875
},
{
genres: [ 'Drama', 'Romance' ],
title: 'Summer',
released: ISODate('1986-08-29T00:00:00.000Z'),
paginationToken: 'CO0gGgkpAHCiY3oAAAA=',
score: 3.5844719409942627
},
{
genres: [ 'Drama', 'Thriller' ],
title: 'Summer Camp Nightmare',
released: ISODate('1987-04-17T00:00:00.000Z'),
paginationToken: 'CNkiGgkpAHQ/CX8AAAA=',
score: 2.579726457595825
},
{
genres: [ 'Action', 'Crime', 'Drama' ],
title: 'Cold Summer of 1953',
released: ISODate('1988-06-01T00:00:00.000Z'),
paginationToken: 'CNsjGgkpACjVTYcAAAA=',
score: 2.262615203857422
},
{
genres: [ 'Drama', 'War' ],
title: 'That Summer of White Roses',
released: ISODate('1989-07-11T00:00:00.000Z'),
paginationToken: 'CI0mGgkpALSEc48AAAA=',
score: 2.0149309635162354
}
]

Recupere los resultados para compilar una función como "Página anterior" en la aplicación.

Para recuperar los resultados anteriores, se debe especificar el punto de referencia antes del cual desea recuperar los resultados.

La consulta de ejemplo utiliza las siguientes etapas de la canalización para devolver resultados en la primera página utilizando el token generado por searchSequenceToken de la consulta anterior para el mismo término:

etapa de pipeline
Descripción
  • Busca títulos que contengan summer en el campo title usando el operador de texto.

  • Retorna los documentos 1 al 10 en los resultados de MongoDB Search usando la opción searchBefore con el token de paginación asociado con el undécimo documento en los resultados de la consulta ejecutada para Recuperar Página 2 Usando searchAfter.

  • Ordena los resultados por el valor del campo released en orden ascendente usando la opción de ordenar.

Limita los resultados a 10 documentos.

Solo incluye los campos title, released y genres de los documentos de los resultados. También añade los siguientes campos a cada documento de los resultados:

  • paginationToken, que es el token que se puede utilizar como punto de referencia en las query posteriores

  • score, que es la puntuación de relevancia del documento en los resultados

Nota

Por defecto, MongoDB Search devuelve los resultados en orden inverso para las queries que especifican tokens a fin de recuperar los resultados antes de un punto de referencia. Para devolver los documentos en orden, la query utiliza los métodos toArray() y JavaScript reverse().

db.movies.aggregate([
{
"$search": {
"index": "pagination-tutorial",
"text": {
"path": "title",
"query": "summer"
},
"searchBefore": "CMwSGgkpAECHcCIAAAA=",
"sort": { "released": 1 }
}
},
{
"$limit": 10
},
{
"$project": {
"_id": 0,
"title": 1,
"released": 1,
"genres": 1,
"paginationToken" : { "$meta" : "searchSequenceToken" },
"score": { "$meta": "searchScore" }
}
}
]).toArray().reverse()
[
{
genres: [ 'Drama' ],
title: "A Summer at Grandpa's",
paginationToken: 'CKUdGgJgAA==',
score: 2.262615203857422
},
{
genres: [ 'Musical', 'Romance' ],
title: 'Summer Stock',
released: ISODate('1951-01-22T00:00:00.000Z'),
paginationToken: 'CJsFGgkpAHw/0HT///8=',
score: 3.000213623046875
},
{
genres: [ 'Comedy', 'Romance' ],
title: 'Smiles of a Summer Night',
released: ISODate('1957-12-23T00:00:00.000Z'),
paginationToken: 'CKIHGgkpAKDlpaf///8=',
score: 2.0149309635162354
},
{
genres: [ 'Drama' ],
title: 'Violent Summer',
released: ISODate('1959-11-13T00:00:00.000Z'),
paginationToken: 'CI8JGgkpAJhJh7X///8=',
score: 3.000213623046875
},
{
genres: [ 'Drama', 'Romance' ],
title: 'A Summer Place',
released: ISODate('1959-11-18T00:00:00.000Z'),
paginationToken: 'CLoJGgkpAGQJobX///8=',
score: 2.579726457595825
},
{
genres: [ 'Drama' ],
title: 'The End of Summer',
released: ISODate('1962-02-01T00:00:00.000Z'),
paginationToken: 'CK0KGgkpAAzP18X///8=',
score: 2.262615203857422
},
{
genres: [ 'Drama', 'Romance' ],
title: 'Summer and Smoke',
released: ISODate('1962-04-01T00:00:00.000Z'),
paginationToken: 'CMQKGgkpAECmB8f///8=',
score: 2.579726457595825
},
{
genres: [ 'Documentary', 'Sport' ],
title: 'The Endless Summer',
released: ISODate('1968-08-17T00:00:00.000Z'),
paginationToken: 'CO4MGgkpAJjH5vX///8=',
score: 2.579726457595825
},
{
genres: [ 'Comedy', 'Drama', 'Romance' ],
title: "Summer of '42",
released: ISODate('1971-04-09T00:00:00.000Z'),
paginationToken: 'CPQQGgkpAGRgUAkAAAA=',
score: 2.579726457595825
},
{
genres: [ 'Drama' ],
title: 'That Certain Summer',
released: ISODate('1972-11-01T00:00:00.000Z'),
paginationToken: 'COwRGgkpAPQV0hQAAAA=',
score: 2.579726457595825
}
]

Recupere los resultados para compilar una función en la aplicación que permita omitir páginas.

Para omitir los resultados e ir de la página 2 a la 5, utilice el token que genera searchSequenceToken para especificar el punto de referencia después del cual desea recuperar los resultados y, a continuación, omita veinte documentos en los resultados.

La consulta de ejemplo utiliza las siguientes etapas de la canalización para saltar a los resultados en la página 5 utilizando el token generado por searchSequenceToken de la consulta anterior para el mismo término y utilizando las etapas $skip $limit y:

etapa de pipeline
Descripción
  • Busca títulos que contengan summer en el campo title usando el operador de texto.

  • Ordena los resultados por el valor del campo released en orden ascendente usando la opción de ordenar.

  • Devuelva los documentos posteriores al vigésimo documento especificado utilizando el token de paginación generado por la query que ejecutó para Recuperar la página 2 con searchAfter.

Omite 20 documentos en los resultados después del punto de referencia especificado, que es el token asociado con el vigésimo documento en los resultados de la query que se ejecutó para Recuperar la página 2 con searchAfter.

Limita los resultados a 10 documentos.

Solo incluye los campos title, released y genres de los documentos de los resultados. También añade los siguientes campos a cada documento de los resultados:

  • paginationToken, que es el token que se puede utilizar como punto de referencia en las query posteriores

  • score, que es la puntuación de relevancia del documento en los resultados

db.movies.aggregate([
{
"$search": {
"index": "pagination-tutorial",
"text": {
"path": "title",
"query": "summer"
},
"searchAfter": "COwRGgkpAPQV0hQAAAA=",
"sort": { "released": 1 }
}
},
{
"$skip": 20
},
{
"$limit": 10
},
{
"$project": {
"_id": 0,
"title": 1,
"released": 1,
"genres": 1,
"paginationToken" : { "$meta" : "searchSequenceToken" },
"score": { "$meta": "searchScore" }
}
}
])
[
{
genres: [ 'Drama' ],
title: 'A Storm in Summer',
released: ISODate('2000-02-27T00:00:00.000Z'),
paginationToken: 'CO5FGgkpAChakN0AAAA=',
score: 2.262615203857422
},
{
genres: [ 'Comedy', 'Romance' ],
title: 'Wet Hot American Summer',
released: ISODate('2002-04-11T00:00:00.000Z'),
paginationToken: 'CKtIGgkpAFBUIu0AAAA=',
score: 2.262615203857422
},
{
genres: [ 'Comedy', 'Drama', 'Romance' ],
title: 'Summer Things',
released: ISODate('2002-10-09T00:00:00.000Z'),
paginationToken: 'CIpPGgkpAFxzxvAAAAA=',
score: 3.000213623046875
},
{
genres: [ 'Adventure', 'Drama', 'Family' ],
title: 'Wolf Summer',
released: ISODate('2003-02-28T00:00:00.000Z'),
paginationToken: 'COZWGgkpAGS6ofMAAAA=',
score: 3.000213623046875
},
{
genres: [ 'Animation', 'Adventure' ],
title: 'Nasu: Summer in Andalusia',
released: ISODate('2003-06-26T00:00:00.000Z'),
paginationToken: 'CNlaGgkpAMxoAfYAAAA=',
score: 2.262615203857422
},
{
genres: [ 'Drama' ],
title: 'Spring, Summer, Fall, Winter... and Spring',
released: ISODate('2004-05-28T00:00:00.000Z'),
paginationToken: 'CJ5ZGgkpAOjnyPwAAAA=',
score: 1.8161234855651855
},
{
genres: [ 'Comedy', 'Drama', 'Romance' ],
title: 'Summer Storm',
released: ISODate('2004-09-02T00:00:00.000Z'),
paginationToken: 'CMVfGgkpAMRwvP4AAAA=',
score: 3.000213623046875
},
{
genres: [ 'Drama' ],
title: 'Summer in the Golden Valley',
released: ISODate('2004-10-08T00:00:00.000Z'),
paginationToken: 'CNNWGgkpALTVdf8AAAA=',
score: 2.0149309635162354
},
{
genres: [ 'Drama', 'Romance' ],
title: 'My Summer of Love',
released: ISODate('2005-07-01T00:00:00.000Z'),
paginationToken: 'CL5aGgkpAEyxzwQBAAA=',
score: 2.262615203857422
},
{
genres: [ 'Drama' ],
title: 'Summer in Berlin',
released: ISODate('2006-01-05T00:00:00.000Z'),
paginationToken: 'CPZmGgkpANzclwgBAAA=',
score: 2.579726457595825
}
]

Usar searchSequenceToken con las facetas de MongoDB Search.

Para agrupar resultados utilizando MongoDB Search facet (operador MongoDB Search), debes indexar cualquier campo string que sea del tipo token. Para ejecutar la siguiente query y agrupar los resultados por el campo genres de la colección movies, tu índice debe parecerse al del siguiente ejemplo:

{
"mappings": {
"dynamic": true,
"fields": {
"genres": {
"type": "token"
}
}
}
}
}

La query de muestra utiliza las siguientes etapas de pipeline:

etapa de pipeline
Descripción
  • Busca títulos que contengan summer en el campo title utilizando el colector facet (MongoDB Search operador).

  • Recupera un recuento del número total de películas de los resultados de cada género utilizando la opción facets.

Añade el campo paginationToken para almacenar los tokens de cada documento en los resultados generados mediante la opción searchSequenceToken.

Limita los resultados a 10 documentos.

Devuelve los siguientes campos:

  • docs , que contiene solo los campos title, released y genres de los documentos de los resultados y el campo paginationToken.

  • meta , que contiene un recuento del número total de películas en los resultados de cada género que se almacena en la variable $$SEARCH_META.

db.movies.aggregate([
{
"$search": {
"index": "pagination-tutorial",
"facet": {
"operator": {
"text": {
"path": "title",
"query": "summer"
}
},
"facets": {
"genresFacet": {
"type": "string",
"path": "genres"
}
}
}
}
},
{
"$addFields": {
"paginationToken" : { "$meta" : "searchSequenceToken" }
}
},
{ "$limit": 10 },
{
"$facet": {
"docs": [
{ "$project":
{
"_id": 0,
"title": 1,
"released": 1,
"genres": 1,
"paginationToken" : 1
}
}
],
"meta": [
{ "$replaceWith": "$$SEARCH_META" },
{ "$limit": 1 }
]
}
},
{
"$set": {
"meta": {
"$arrayElemAt": ["$meta", 0]
}
}
}
])
[
{
docs: [
{
genres: [ 'Drama', 'Romance' ],
title: 'Summer',
released: ISODate('1986-08-29T00:00:00.000Z'),
paginationToken: 'CO0gFf1nZUA='
},
{
genres: [ 'Musical', 'Romance' ],
title: 'Summer Stock',
released: ISODate('1951-01-22T00:00:00.000Z'),
paginationToken: 'CJsFFYADQEA='
},
{
genres: [ 'Drama' ],
title: 'Violent Summer',
released: ISODate('1959-11-13T00:00:00.000Z'),
paginationToken: 'CI8JFYADQEA='
},
{
genres: [ 'Drama' ],
title: 'Indian Summer',
released: ISODate('1978-11-01T00:00:00.000Z'),
paginationToken: 'CNYRFYADQEA='
},
{
genres: [ 'Drama' ],
title: 'Indian Summer',
released: ISODate('1978-11-01T00:00:00.000Z'),
paginationToken: 'CNsRFYADQEA='
},
{
genres: [ 'Comedy' ],
title: 'Summer Rental',
released: ISODate('1985-08-09T00:00:00.000Z'),
paginationToken: 'CL8fFYADQEA='
},
{
genres: [ 'Comedy', 'Drama', 'Romance' ],
title: 'Summer Things',
released: ISODate('2002-10-09T00:00:00.000Z'),
paginationToken: 'CIpPFYADQEA='
},
{
genres: [ 'Adventure', 'Drama', 'Family' ],
title: 'Wolf Summer',
released: ISODate('2003-02-28T00:00:00.000Z'),
paginationToken: 'COZWFYADQEA='
},
{
genres: [ 'Comedy', 'Drama', 'Romance' ],
title: 'Summer Storm',
released: ISODate('2004-09-02T00:00:00.000Z'),
paginationToken: 'CMVfFYADQEA='
},
{
genres: [ 'Drama', 'Romance' ],
title: 'Summer Palace',
released: ISODate('2007-04-18T00:00:00.000Z'),
paginationToken: 'CIRrFYADQEA='
}
],
meta: {
count: { lowerBound: Long('65') },
facet: {
genresFacet: {
buckets: [
{ _id: 'Drama', count: Long('48') },
{ _id: 'Romance', count: Long('20') },
{ _id: 'Comedy', count: Long('19') },
{ _id: 'Family', count: Long('7') },
{ _id: 'Adventure', count: Long('5') },
{ _id: 'Crime', count: Long('5') },
{ _id: 'Mystery', count: Long('5') },
{ _id: 'Thriller', count: Long('5') },
{ _id: 'Horror', count: Long('4') },
{ _id: 'Action', count: Long('3') }
]
}
}
}
}
]