2012-07-22 22 views
60

Cuando ejecutamos una búsqueda de Mongo find() sin ningún orden de clasificación especificado, ¿qué usa la base de datos internamente para ordenar los resultados?¿Cómo ordena MongoDB los registros cuando no se especifica un orden de clasificación?

De acuerdo con la documentation on the mongo website:

Al ejecutar un find() sin ningún parámetro, la base de datos devuelve objetos en orden natural hacia adelante.

Para las tablas estándar, orden natural no es particularmente útil porque, aunque el orden es a menudo cerca de orden de inserción, no es garantiza que sea. Sin embargo, para las Colecciones limitadas, el orden natural es con la garantía de ser el pedido de inserción. Esto puede ser muy útil.

Sin embargo, para colecciones estándar (colecciones no cubiertas), ¿qué campo se utiliza para ordenar los resultados? ¿Es el campo _id o algo más?

Editar:

Básicamente, creo que lo que estoy tratando de llegar es que si ejecuta la siguiente consulta de búsqueda:

db.collection.find({"x":y}).skip(10000).limit(1000); 

en dos puntos diferentes en el tiempo: t1 y t2, tendrá que obtener diferentes conjuntos de resultados:

  1. Cuando no ha habido escrituras adicionales entre t1 & t2?
  2. ¿Cuándo ha habido nuevas escrituras entre t1 & t2?
  3. ¿Hay nuevos índices que se hayan añadido entre t1 & t2?

he ejecutar algunas pruebas en una base de datos temporal y los resultados que he obtenido son los mismos () para todos los 3 casos - pero quería estar seguro y estoy seguro de que mis casos de prueba no eran muy completo

Respuesta

66

Por definición, el tipo se predetermina a, al igual que el orden de devolución de los documentos. Si no hay consulta, usará el natural order. Los resultados se devuelven en el orden se encuentran, que pueden coincidir con el orden de inserción (pero no se garantiza) o el orden de los índices utilizados.

Algunos ejemplos que afectarán de almacenamiento (natural) para:

  • si los documentos se actualizan y no caber en su espacio asignado actualmente, van a ser movidos
  • nuevos documentos se pueden insertar en la disposición huecos creados por documentos eliminados o movidos

Si se utiliza un índice, los documentos se devolverán en el orden en que se encuentran. Si se utiliza más de un índice, el orden depende internamente de qué índice identificó por primera vez el documento durante el proceso de deduplicación.

Si desea un orden específico entonces necesidad incluyen una especie con su consulta.

La excepción notada para capped collections' natural order se debe a que los documentos no se pueden mover y se almacenan en orden de inserción. El pedido es parte de la función de colección con tope que asegura que los documentos más antiguos "envejezcan" primero. Además, los documentos no se pueden eliminar ni mover en una colección con tope (consulte Usage and Restrictions para obtener más información).

+3

Esto significa que si ejecuto el mismo comando find: db.collection.find ({"x": y}). Skip (20000) .limit (1000) en dos momentos diferentes en el tiempo, lo haré obtener diferentes conjuntos de resultados? ¿Qué sucede si no ha habido escrituras entre los dos comandos? – saurabhj

+4

@saurabhj: Se agregaron algunos ejemplos que afectarán el orden natural. Si los documentos se han movido/eliminado, puede obtener diferentes conjuntos de resultados. Si no ha habido inserciones/actualizaciones/eliminaciones de documentos, debe obtener el mismo resultado. Agregar índices no afecta la ubicación de los documentos en el disco. – Stennie

+4

También debería agregarse la advertencia de que si usa [replicación] (http://www.mongodb.org/display/DOCS/Replication), el orden natural puede variar entre los miembros del conjunto de réplicas. – Stennie

3

Se devuelve en el orden almacenado (orden en el archivo), pero no se garantiza que estén en el orden insertado. No están ordenados por el campo _id. A veces puede parecer que está ordenado por el orden de inserción, pero puede cambiar en otra solicitud. No es confiable.

Cuestiones relacionadas