sql >> Base de Datos >  >> NoSQL >> MongoDB

Obtenga el índice de un elemento dentro de la consulta mongodb

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 con finalize() 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.