En Mangosta, ¿cómo clasifico por fecha? (node.js)


161

Digamos que ejecuto esta consulta en Mongoose:

Room.find({}, function(err,docs){

}).sort({date:-1}); 

¡Esto no funciona!

Respuestas:


429

La clasificación en Mongoose ha evolucionado a lo largo de los lanzamientos de manera que algunas de estas respuestas ya no son válidas. A partir de la versión 4.1.x de Mongoose, datese puede realizar una clasificación descendente en el campo de cualquiera de las siguientes maneras:

Room.find({}).sort('-date').exec(function(err, docs) { ... });
Room.find({}).sort({date: -1}).exec(function(err, docs) { ... });
Room.find({}).sort({date: 'desc'}).exec(function(err, docs) { ... });
Room.find({}).sort({date: 'descending'}).exec(function(err, docs) { ... });
Room.find({}).sort([['date', -1]]).exec(function(err, docs) { ... });
Room.find({}, null, {sort: '-date'}, function(err, docs) { ... });
Room.find({}, null, {sort: {date: -1}}, function(err, docs) { ... });

Para un orden ascendente, omitir el -prefijo de la versión de cadena o valores de uso de 1, asco ascending.


1
+1 por mostrar toneladas de diferentes formas en que se puede hacer. Sin embargo, no puedo encontrar en los documentos que Query # find tomará tantos argumentos. La firma es Query#find([criteria], [callback]). Pensé que tal vez había un apretón de manos secreto que dice que "criterios" pueden tener hasta tres argumentos, pero enumera el tipo como "Objeto".
Nateowami

@Nateowami Estás viendo el findmétodo incorrecto en los documentos. Ver Model.find.
JohnnyHK

1
Tienes razón. Vi que estaban usando la Module#propertynotación y busqué #find. Parece que no hay una manera fácil de navegar o buscar en los documentos. La búsqueda de resultados arroja 187 resultados.
Nateowami

2
También puede ordenar por _idcampo. Por ejemplo, para obtener el registro más reciente, puede hacer:await db.collection.findOne().sort({ _id: -1 });
Mike K


12

He estado lidiando con este problema hoy usando Mongoose 3.5 (.2) y ninguna de las respuestas me ayudó a resolver este problema. El siguiente fragmento de código hace el truco

Post.find().sort('-posted').find(function (err, posts) {
    // user posts array
});

Puede enviar cualquier parámetro estándar que necesite find()(p. Ej., Cláusulas where y campos de retorno) pero sin devolución de llamada. Sin una devolución de llamada, devuelve un objeto de consulta que se encadena sort(). find()Debe volver a llamar (con o sin más parámetros, no debería necesitar ninguno por razones de eficiencia), lo que le permitirá obtener el conjunto de resultados en su devolución de llamada.


4

Hago esto:

Data.find( { $query: { user: req.user }, $orderby: { dateAdded: -1 } } function ( results ) {
    ...
})

Esto mostrará primero las cosas más recientes.


1
$orderbyestá en desuso en MongoDB 3.2, por lo que ya no debería usarse.
JohnnyHK

4
Post.find().sort({date:-1}, function(err, posts){
});

Debería funcionar también

EDITAR:

También puede intentar usar esto si obtiene el error sort() only takes 1 Argument:

Post.find({}, {
    '_id': 0,    // select keys to return here
}, {sort: '-date'}, function(err, posts) {
    // use it here
});

1
esto me da el error:Error: sort() only takes 1 Argument
Mrid

@LukeXF por favor vea la respuesta actualizada. espero que te ayude :)
mrid

@mrid debería ser como: Post.find({}, {'_id': 0}).sort("-date").function(err, posts){});
Mostafa Ghadimi

2

Solución corta:

const query = {}
const projection = {}
const options = { sort: { id: 1 }, limit: 2, skip: 10 }

Room.find(query, projection, options).exec(function(err, docs) { ... });

1

Ese primer método no funciona. Simplemente se cuelga ... Creo que se debe a una actualización en mangosta ... Y el segundo método es solo los documentos de mongo, que conozco.
TIMEX

La función find () es la función de MongoDB, no Mongoose. Lea la página API de Mongoose para obtener más detalles. Puede usar la sintaxis definida en los documentos de MongoDB con Mongoose. Es por eso que Mongoose no tiene sus propias consultas de clasificación o intersección.
neebz

0

También puede ordenar por _idcampo. Por ejemplo, para obtener el registro más reciente, puede hacer,

const mostRecentRecord = await db.collection.findOne().sort({ _id: -1 });

También es mucho más rápido, porque estoy más que dispuesto a apostar que su datecampo no está indexado.

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.