¿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?


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).


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.


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


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) {});


@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



5

Con mangosta es tan simple como:

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

4

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

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

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 :)


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
})
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.