¿Cómo ordenar una colección por fecha en MongoDB?

125

Estoy usando MongoDB con Node.JS. Tengo una colección que contiene una fecha y otras filas. La fecha es un Dateobjeto de JavaScript .

¿Cómo puedo ordenar esta colección por fecha?

fluir
fuente
1
simple, collection.find (). sort ({datefield: 1}, function (err, cursor) {...}); o también puede usar collection.find (). sort ({datefield: -1}, function (err, cursor) {...});
Atul Jain
Tenga en cuenta que es posible que no necesite una datecolumna: stackoverflow.com/questions/5125521/…
phil294

Respuestas:

186

Solo una ligera modificación a la respuesta de @JohnnyHK

collection.find().sort({datefield: -1}, function(err, cursor){...});

En muchos casos de uso, deseamos que se devuelvan los últimos registros (como para las últimas actualizaciones / inserciones).

Sushant Gupta
fuente
1
¿Qué piensa poner en la función? Solo tratar de ordenar Dateobjetos sin una función no me funciona en 2.6.3.
Sam Brightman el
@SamBrightman Esa función es solo una devolución de llamada. Independientemente de lo que desee hacer con el resultado de la consulta, ponga esa lógica dentro de su devolución de llamada. Puede leer más sobre qué son las devoluciones de llamada y cómo funcionan para aprender la programación basada en eventos.
Sushant Gupta
Claro, sé lo que es una devolución de llamada. Solo vi el requisito de clasificación en la pregunta y todas las respuestas dan devoluciones de llamada. Al mismo tiempo, la clasificación no funcionaba para mí, así que pensé que tal vez tengas que hacer un trabajo adicional en la función.
Sam Brightman
1
@SamBrightman Oh, ok. Para mayor comodidad, puede ser explícito y encadenarcollection.find().sort(...).exec(function(err, cursor) {})
Sushant Gupta
55
dice sort () solo toma 1 argumento
Jitendra Pancholi
39

Ordenar por fecha no requiere nada especial. Simplemente ordene por el campo de fecha deseado de la colección.

Actualizado para el controlador nativo de 1.4.28 node.js, puede ordenar de forma ascendente datefieldutilizando cualquiera de las siguientes formas:

collection.find().sort({datefield: 1}).toArray(function(err, docs) {...});
collection.find().sort('datefield', 1).toArray(function(err, docs) {...});
collection.find().sort([['datefield', 1]]).toArray(function(err, docs) {...});
collection.find({}, {sort: {datefield: 1}}).toArray(function(err, docs) {...});
collection.find({}, {sort: [['datefield', 1]]}).toArray(function(err, docs) {...});

'asc'o 'ascending'también se puede usar en lugar de 1.

Para descendente tipo, uso 'desc', 'descending'o -1en lugar de la 1.

JohnnyHK
fuente
Estoy aplicando la solución anterior en el campo de nombre de usuario, funciona bien pero distingue entre mayúsculas y minúsculas ¿Cómo ignorarlo?
Rahul Matte
Respuesta correcta con múltiples vías (y)
abdulbarik
29
db.getCollection('').find({}).sort({_id:-1}) 

Esto ordenará su colección en orden descendente según la fecha de inserción

Rich Rajah
fuente
16

Las respuestas de Sushant Gupta están un poco desactualizadas y ya no funcionan.

El siguiente fragmento debería ser así ahora:

collection.find({}, {"sort" : ['datefield', 'asc']} ).toArray(function(err,docs) {});

krikara
fuente
@JohnnyHK Sweet. No recuerdo el escenario exacto, pero el verano pasado estaba tratando de hacer que el tipo funcionara con el fragmento de Sushant y simplemente no estaba funcionando para mí. Quizás es porque le faltaba la toArrayparte.
krikara
Esta es en realidad una respuesta incorrecta, da un resultado incorrecto en node.js
David A
12

Esto funcionó para mí:

collection.find({}, {"sort" : [['datefield', 'asc']]}, function (err, docs) { ... });

Usando Node.js, Express.js y Monk

GoldfishGrenade
fuente
5

Con mangosta es tan simple como:

collection.find().sort('-date').exec(function(err, collectionItems) {
  // here's your code
})
emil.c
fuente
4

Se requiere un corchete adicional [] para que el parámetro de clasificación funcione.

collection.find({}, {"sort" : [['datefield', 'asc']]} ).toArray(function(err,docs) {});
DB Prasad
fuente
2

si su formato de fecha es así: 14/02/1989 ----> puede encontrar algunos problemas

necesitas usar ISOdate así:

var start_date = new Date(2012, 07, x, x, x); 

-----> el resultado ------> ISODate ("2012-07-14T08: 14: 00.201Z")

ahora solo usa la consulta de esta manera:

 collection.find( { query : query ,$orderby :{start_date : -1}} ,function (err, cursor) {...}

Eso es :)

Amine_Dev
fuente
2

Con mangosta no pude usar 'toArray' y recibí el error: TypeError: Collection.find(...).sort(...).toArray is not a function. la función toArray existe en la clase Cursor del controlador Native MongoDB NodeJS ( referencia ).

También sort acepta solo un parámetro, por lo que no puede pasar su función dentro de él.

Esto funcionó para mí (como respondió Emil ):

collection.find().sort('-date').exec(function(error, result) {
  // Your code
})
Pransh Tiwari
fuente