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.
Uso
Para recuperar resultados paginados, realiza los siguientes pasos:
Crea un índice en los campos que deseas consultar.
Ejecuta una
$searchquery que devuelva un punto de referencia. Para aprender más, se puede consultar Recuperar Punto de Referencia.Utiliza el punto de referencia en tu query
$searchposterior para recuperar el conjunto de documentos anterior o siguiente de los resultados.Para aprender más sobre cómo recuperar resultados para compilar una función de “Página siguiente”, consulta búsqueda después de un punto de referencia específico.
Para aprender más sobre cómo recuperar resultados para compilar una función de "Página anterior", consulta Búsqueda antes de un punto de referencia específico.
Para saltar a una página en tus resultados, combina
$skipy$limitcon$searchopciones desearchAfterosearchBefore. 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:Recupera los resultados usando
searchAftercon el punto de referencia para el último resultado en la página 3 (Resultado 30).Devuelve los resultados de la página 5 (resultados 41-50).
Aquí, usar
$skipcon la opciónsearchAfteroptimiza la query para omitir solo 1 página de resultados (10 documentos). En comparación, si se usa$skipsin la opción$searchsearchAfter, la query omite 4 páginas de resultados (40 documentos). Para aprender más, consulte Ir de la página 2 a la página 5 con searchAfter y $skip.
Considerations
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
searchAfterysearchBefore. 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, comoupdated_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 puntuacionesbm25cuando 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 ensecondaryonearest.Para asegurar puntuaciones coherentes en queries posteriores, configure la propiedad
similarity.typeenstableTflobooleanal 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 similitudstableTflobooleanpara 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 la búsqueda durante la paginación, utilice la opción count en su query inicial
$searcho en una query separada$searchMeta. Este método es más eficiente que usar la$countetapa después de su$searchetapa.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
counten queries posteriores si estás generando resultados paginados. Para mantener el conteo separado de la consulta principal$search, utilice una etapa$searchMetacon la opcióncount.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.
Recupera el punto de referencia
Para recuperar los resultados de la query en un punto determinado, debes proporcionar el punto de referencia en tu $search query. Puedes recuperar el punto de referencia utilizando la $meta palabra clave searchSequenceToken en la $project etapa después de tu $search etapa.
Sintaxis
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 }]
Salida
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.
Búsqueda según un punto de referencia específico
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 opción searchAfter para compilar una función de “Página siguiente” en tu aplicación. Para una demostración de esto, ve el ejemplo en esta página.
searchAfter Sintaxis
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 }]
Salida
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 el searchSequenceToken en la $project etapa después de la $search etapa (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.
Busca antes de un punto de referencia específico
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, consulta los searchBefore ejemplos de query en esta página.
searchBefore Sintaxis
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 }]
searchBefore Salida
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ó el 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.
Ejemplos
Los siguientes ejemplos utilizan el método db.collection.aggregate() para ejecutar query $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 query de ejemplo en mongosh:
Cargar la sample_mflix.movies colección
Crea el índice
pagination-tutorialcon mapeos dinámicos. Para aprender cómo crear un índice, consulte Administración de índices MongoDB SearchConéctate al clúster utilizando
mongoshy pasa a la base de datossample_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.