Como classificar uma coleção por data no MongoDB?

125

Estou usando o MongoDB com Node.JS. Eu tenho uma coleção que contém uma data e outras linhas. A data é um Dateobjeto JavaScript .

Como posso classificar essa coleção por data?

fluxo
fonte
1
simples, collection.find (). sort ({datefield: 1}, função (err, cursor) {...}); ou você também pode usar collection.find (). sort ({datefield: -1}, function (err, cursor) {...});
Atul Jain
Observe que você pode não precisar de uma datecoluna: stackoverflow.com/questions/5125521/…
phil294 30/07/19

Respostas:

186

Apenas uma ligeira modificação na resposta @JohnnyHK

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

Em muitos casos de uso, desejamos que os registros mais recentes sejam retornados (como nas atualizações / inserções mais recentes).

Sushant Gupta
fonte
1
O que você pretende colocar na função? Apenas tentar classificar Dateobjetos sem uma função não está funcionando para mim no 2.6.3.
Sam Brightman
@SamBrightman Essa função é apenas um retorno de chamada. Tudo o que você deseja fazer com o resultado da consulta, você coloca essa lógica em seu retorno de chamada. Você pode ler mais sobre o que são retornos de chamada e como eles funcionam para aprender a programação baseada em eventos.
precisa
Claro, eu sei o que é um retorno de chamada. Eu só vi o requisito de classificação na pergunta e todas as respostas fornecem retornos de chamada. Ao mesmo tempo, a classificação não estava funcionando para mim, então pensei que talvez você devesse fazer um trabalho adicional na função.
18715 Sam Sammanman
1
@SamBrightman Oh ok. Por conveniência, você pode ser explícito e encadeado como #collection.find().sort(...).exec(function(err, cursor) {})
Sushant Gupta
5
diz sort () leva apenas 1 argumento
Jitendra Pancholi 18/11
39

Classificar por data não requer nada de especial. Basta classificar pelo campo de data desejado da coleção.

Atualizado para o driver nativo 1.4.28 node.js., você pode classificar em ascensão datefieldusando qualquer uma das seguintes maneiras:

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'ou 'ascending'também pode ser usado no lugar do 1.

Para descendente de, uso 'desc', 'descending'ou -1no lugar do 1.

JohnnyHK
fonte
Estou aplicando a solução acima no campo Nome de usuário. Está funcionando bem, mas diferencia maiúsculas de minúsculas. Como ignorá-lo?
Rahul Matte
Resposta certa com várias vias (y)
abdulbarik
29
db.getCollection('').find({}).sort({_id:-1}) 

Isso classificará sua coleção em ordem decrescente com base na data de inserção

Rich Rajah
fonte
16

As respostas de Sushant Gupta estão um pouco desatualizadas e não funcionam mais.

O seguinte snippet deve ser assim agora:

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

krikara
fonte
@JohnnyHK Sweet. Não me lembro do cenário exato, mas no verão passado eu estava tentando fazer o tipo funcionar com o trecho de Sushant e isso simplesmente não estava funcionando para mim. Talvez seja porque faltava o toArraypapel.
krikara
Esta é realmente uma resposta errada, dá um resultado errado no node.js #
David A
12

Isso funcionou para mim:

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

Usando Node.js, Express.js e Monk

Peixe Dourado
fonte
5

Com o mangusto, é tão simples quanto:

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

Suporte quadrado [] adicional é necessário para que o parâmetro de classificação funcione.

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

se o seu formato de data for o seguinte: 14/02/1989 ----> você pode encontrar alguns problemas

você precisa usar o ISOdate assim:

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

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

agora basta usar a consulta como esta:

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

é isso aí :)

Amine_Dev
fonte
2

Com o mangusto, não consegui usar 'toArray' e estava recebendo o erro: TypeError: Collection.find(...).sort(...).toArray is not a function. A função toArray existe na classe Cursor do driver Native MongoDB NodeJS ( referência ).

A classificação também aceita apenas um parâmetro, portanto você não pode passar sua função dentro dele.

Isso funcionou para mim (como respondido por Emil ):

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