Según la respuesta a la pregunta , el orden de las propiedades de un objeto no está garantizado. Entonces, ¿cómo funciona perfectamente la función de clasificación en MongoDB cuando pasamos varios campos de clasificación como un objeto?
db.users.find({}).sort({firstName: 1, age:-1}).exec(callback);¿Cómo sabe mongodb que primero tiene que ordenar por nombre y luego por edad? ¿Está trabajando en una suposición incorrecta?
Esta es una pregunta interesante.
Funciona ya que la mayoría de las implementaciones de ECMAScript realmente conservan el orden de las claves (por ejemplo, V8 que utiliza Node). Sin embargo, el controlador oficial de Node MongoDB no fomenta su uso, sino que ofrece dos notaciones diferentes:
La clasificación se puede lograr con la opción de clasificación de parámetros que toma una variedad de preferencias de clasificación
{ "sort": [['field1','asc'], ['field2','desc']] }Con un solo campo ascendente, la matriz se puede reemplazar con el nombre del campo.
{ "sort": "name" }
La documentación de Mongoose no menciona nada sobre el orden de las claves (al menos no que yo sepa). Pero también ofrece dos enfoques diferentes para clasificar :
// sort by "field" ascending and "test" descending query.sort({ field: 'asc', test: -1 }); // equivalent query.sort('field -test');
De hecho, parece que la funcionalidad de clasificación de Mongoose se basó en una suposición incorrecta (pero actualmente válida). Probablemente sea mejor si usa la notación de cadena al ordenar con varias claves. Ordenar con la notación de objetos funciona correctamente cuando se usa MongoDB directamente (por ejemplo, en el shell de MongoDB) ya que no usa JSON puro sino JSON extendido .
También vea esta pregunta muy relacionada: ¿Cómo puede especificar el orden de las propiedades en un objeto javascript para un índice MongoDB en node.js?
También hay un problema de Mongoose sobre esto:
Sí, ese es un dilema desafortunado tanto para la mangosta como para el controlador mongodb. ECMAScript dice que las claves no están ordenadas, pero en realidad están ordenadas en V8 (excepto las teclas numéricas, que es un caso extremo desagradable), y probablemente seguirán ordenándose en V8 en el futuro previsible. Puede usar la sintaxis [['field1', 'asc']] o la sintaxis específica de mongoose 'field1 -field2' o la clase Map ES2015 (que garantiza el orden de inserción de las claves) si le preocupa el orden de las claves.
Entonces, cuando use Mongoose, use la notación de cadena o el soporte recientemente agregado para ES2015 Maps que se garantiza que se ordenarán por orden de inserción.
En su ejemplo, utiliza índices para operaciones de ordenación en MongoDB y si ordena con varios campos, crea un índice compuesto para admitir la ordenación en varios campos. Como hizo cuando proporcionó índices, el planificador de consultas obtiene el orden de clasificación de sus índices (el orden de su ejemplo: nombre, apellido) y ordenará según su orden. En el otro ejemplo es un objeto javascript. Javascript no garantiza la clasificación.