Ordenar por ID de sujeto
Si su subjectID
es (o se puede cambiar a) un valor que aumenta monótonamente (por ejemplo, un ObjectID predeterminado de MongoDB), tiene una opción sencilla usando un find()
normal con la ordenación, el salto y el límite apropiados. En este caso, puede buscar documentos con subjectIDs $gte
(mayor o igual que)
su subjectID
:
var page = 1;
var subjectID = ObjectId("515535a0760fe8735f5f6897");
db.users.find(
{ _id: { $gte : subjectID } }
).sort({'_id':1}).skip(page*20).limit(20)
Marco de agregación
Como en MongoDb 2.4, no existe tal función en el marco de agregación para hacer coincidir según la posición del documento en la canalización de resultados. Puede presentar una sugerencia de nueva función en el SERVER del proyecto MongoDB Jira cola.
Parece que le gustaría un nuevo operador de canalización como $matchfrom
que ignoraría cualquier documento hasta la primera aparición de $matchfrom
criterios. Luego podría agregar un $limit
para tomar los siguientes n elementos. También le gustaría tener una salida ordenada antes de $matchfrom
por lo que hay un resultado predecible.
Esto parece demasiado complicado en comparación con tener un Id. de sujeto en aumento, pero puede haber un caso de uso para hacer paginación en función de criterios de búsqueda más avanzados o resultados calculados en la canalización de agregación.
Enfoques alternativos
Aparte del soporte futuro para dicha función en el marco de agregación, tiene algunas opciones para implementar el mismo enfoque de coincidencia en el código:
-
use el antiguo
group()
comando de agregación confinalize()
función. NOTA:group()
no trabajar con clústeres fragmentados. -
use MapReduce y un
finalize()
función -
obtenga todo el conjunto de resultados del marco de agregación e implemente la coincidencia/reducción de resultados en el código de su aplicación (aunque esto anula un poco la noción de "paginación" si está obteniendo todas las páginas para cada solicitud).
Consideraciones de rendimiento
Consultas con skip
aún tendrá que leer las entradas de índice intermedias, por lo que omitir una gran cantidad de documentos no será muy eficiente.
En lugar de paginar con un desplazamiento de salto, podría considerar realizar consultas de página sucesivas comenzando desde la última entrada de la página anterior (es decir, la primera página sería $gte
el ID de sujeto inicial y las páginas subsiguientes serían $gt
el último subjectID incluido en la página anterior). Esto dependerá de cómo presente la paginación en su interfaz de usuario; sería más fácil usar este enfoque si su IU solo tiene la opción de mostrar la página "siguiente" de mensajes en lugar de saltar a una página específica.