No Mongoose, como faço para classificar por data? (node.js)

159

digamos que eu execute esta consulta no Mongoose:

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

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

Isso não funciona!

TIMEX
fonte

Respostas:

427

A classificação no Mongoose evoluiu ao longo dos lançamentos, de modo que algumas dessas respostas não são mais válidas. A partir da versão 4.1.x do Mongoose, uma classificação decrescente no datecampo pode ser feita das seguintes maneiras:

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 um tipo ascendente, omitir o -prefixo nos valores versão string ou uso de 1, ascou ascending.

JohnnyHK
fonte
1
+1 por mostrar várias maneiras diferentes de fazê-lo. No entanto, não consigo encontrar nos documentos que a consulta # find terá tantos argumentos. A assinatura é Query#find([criteria], [callback]). Eu pensei que talvez houvesse algum aperto de mão secreto que diz que "critérios" podem ter até três argumentos, mas lista o tipo como "Objeto".
Nateowami 17/02
@Nateowami Você está vendo o findmétodo errado nos documentos. Veja Model.find.
21717 JohnnyHK
1
Você está certo. Vi que eles estavam usando a Module#propertynotação e procurei #find. Parece que não há uma maneira fácil de navegar ou pesquisar os documentos. A busca por localização produz 187 resultados.
Nateowami 17/02
1
Você também pode classificar por _idcampo. Por exemplo, para obter o registro mais recente, você pode:await db.collection.findOne().sort({ _id: -1 });
Mike K
53

A resposta correta é:

Blah.find({}).sort({date: -1}).execFind(function(err,docs){

});
TIMEX
fonte
13
a sintaxe tipo atualizado para o exemplo acima é: sort ( '- data') mongoosejs.com/docs/api.html#query_Query-sort
emilebaizel
3
Este não funcionou para mim. Estou recebendo um erro "User.find (...). Sort (...). ExecFind não é uma função"
Sandip Subedi
12

Hoje lidei com esse problema usando o Mongoose 3.5 (.2) e nenhuma das respostas me ajudou a resolver esse problema. O seguinte trecho de código faz o truque

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

Você pode enviar qualquer parâmetro padrão necessário find()(por exemplo, cláusulas where e campos de retorno), mas sem retorno de chamada. Sem retorno de chamada, ele retorna um objeto Query no qual você encadeia sort(). É necessário ligar find()novamente (com ou sem mais parâmetros - não deve ser necessário por motivos de eficiência), o que permitirá obter o conjunto de resultados no retorno de chamada.

Jimmy Hillis
fonte
4

Eu faço isso:

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

Isso mostrará as coisas mais recentes primeiro.

Noé
fonte
1
$orderbyfoi descontinuado no MongoDB 3.2 e, portanto, não deve mais ser usado.
JohnnyHK
4
Post.find().sort({date:-1}, function(err, posts){
});

Deve funcionar também

EDITAR:

Você também pode tentar usar isso se receber o erro sort() only takes 1 Argument:

Post.find({}, {
    '_id': 0,    // select keys to return here
}, {sort: '-date'}, function(err, posts) {
    // use it here
});
lynx_vbg
fonte
1
isso me dá o erro:Error: sort() only takes 1 Argument
mrid
@LukeXF, veja a resposta atualizada. Espero que ajude você :)
mrid
@mrid ele deve ser como: Post.find({}, {'_id': 0}).sort("-date").function(err, posts){});
Mostafa Ghadimi
2

Solução curta:

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

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

Veja se isso ajuda> Como classificar em mangusto?

Leia também> http://www.mongodb.org/display/DOCS/Sorting+and+Natural+Order

neebz
fonte
Esse primeiro método não funciona. Ele simplesmente trava ... Eu acho que é por causa de uma atualização no mangusto .... E o segundo método é apenas o mongo docs, que eu conheço.
TIMEX 28/04
A função find () é a função do MongoDB, não o Mongoose. Leia a página da API do Mongoose para obter mais detalhes. Você pode usar a sintaxe definida nos documentos do MongoDB com o Mongoose. É por isso que o Mongoose não possui suas próprias consultas de classificação ou interseção.
neebz
0

Você também pode classificar por _idcampo. Por exemplo, para obter o registro mais recente, você pode fazer,

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

É muito mais rápido também, porque estou mais do que disposto a apostar que seu datecampo não está indexado.

Mike K
fonte