Come ordinare una raccolta per data in MongoDB?


125

Sto usando MongoDB con Node.JS. Ho una raccolta che contiene una data e altre righe. La data è un Dateoggetto JavaScript .

Come posso ordinare questa raccolta per data?


1
semplice, collection.find (). sort ({datefield: 1}, function (err, cursor) {...}); oppure puoi anche usare collection.find (). sort ({datefield: -1}, function (err, cursor) {...});
Atul Jain

Si noti che potrebbe non essere necessario un datecolonna: stackoverflow.com/questions/5125521/...
phil294

Risposte:


187

Solo una leggera modifica alla risposta @JohnnyHK

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

In molti casi d'uso desideriamo che vengano restituiti i record più recenti (come per gli ultimi aggiornamenti / inserimenti).


1
Cosa intendi inserire nella funzione? Il solo tentativo di ordinare gli Dateoggetti senza una funzione non funziona per me su 2.6.3.
Sam Brightman

@SamBrightman Quella funzione è solo un callback. Qualunque cosa tu voglia fare con il risultato della query, inserisci quella logica nella tua richiamata. Puoi leggere di più su cosa sono i callback e su come funzionano per apprendere la programmazione basata su eventi.
Sushant Gupta

Certo, so cos'è una richiamata. Ho visto solo il requisito di ordinamento nella domanda e tutte le risposte danno callback. Allo stesso tempo, l'ordinamento non funzionava per me, quindi ho pensato che forse dovresti fare del lavoro aggiuntivo nella funzione.
Sam Brightman

1
@SamBrightman Oh ok. Per comodità puoi essere esplicito e concatenato comecollection.find().sort(...).exec(function(err, cursor) {})
Sushant Gupta

5
dice che sort () richiede solo 1 argomento
Jitendra Pancholi

39

L'ordinamento per data non richiede nulla di speciale. Basta ordinare in base al campo della data desiderato della raccolta.

Aggiornato per il driver nativo 1.4.28 node.js, puoi ordinare in ordine crescente datefieldutilizzando uno dei seguenti modi:

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'può essere utilizzato anche al posto di 1.

Per ordinamento discendente, uso 'desc', 'descending'o -1al posto del 1.


Sto applicando la soluzione sopra sul campo del nome utente, funziona bene ma distingue tra maiuscole e minuscole Come ignorarlo?
Rahul Matte

Risposta
corretta

30
db.getCollection('').find({}).sort({_id:-1}) 

Questo ordinerà la tua collezione in ordine decrescente in base alla data di inserimento


16

Le risposte di Sushant Gupta sono un po 'obsolete e non funzionano più.

Il seguente frammento dovrebbe essere così ora:

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


@JohnnyHK Sweet. Non ricordo lo scenario esatto, ma l'estate scorsa stavo cercando di far funzionare il tipo con lo snippet di Sushant e semplicemente non funzionava per me. Forse è perché mancava la toArrayparte.
krikara

Questa è in realtà una risposta sbagliata, dà un risultato sbagliato in node.js
David A

12

Questo ha funzionato per me:

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

Utilizzando Node.js, Express.js e Monk



5

Con la mangusta è semplice come:

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

4

Per il funzionamento dei parametri di ordinamento è necessaria una parentesi quadra [] aggiuntiva .

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

2

se il formato della tua data è così: 14/02/1989 ----> potresti riscontrare dei problemi

devi usare ISOdate in questo modo:

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

-----> il risultato ------> ISODate ("2012-07-14T08: 14: 00.201Z")

ora usa la query in questo modo:

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

questo è tutto :)


2

Con mongoose non ero in grado di utilizzare 'toArray' e ricevevo l'errore: TypeError: Collection.find(...).sort(...).toArray is not a function. la funzione toArray esiste sulla classe Cursor dal driver Native MongoDB NodeJS ( riferimento ).

Anche l'ordinamento accetta solo un parametro, quindi non puoi passare la tua funzione al suo interno.

Questo ha funzionato per me (come risposto da Emil ):

collection.find().sort('-date').exec(function(error, result) {
  // Your code
})
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.