flow
flow

Reputation: 5048

How to sort a collection by date in MongoDB?

I am using MongoDB with Node.JS. I have a collection which contains a date and other rows. The date is a JavaScript Date object.

How can I sort this collection by date?

Upvotes: 190

Views: 398127

Answers (10)

Pransh Tiwari
Pransh Tiwari

Reputation: 4202

With mongoose I was not able to use 'toArray', and was getting the error: TypeError: Collection.find(...).sort(...).toArray is not a function. The toArray function exists on the Cursor class from the Native MongoDB NodeJS driver (reference).

Also sort accepts only one parameter, so you can't pass your function inside it.

This worked for me (as answered by Emil):

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

Upvotes: 2

Rich Rajah
Rich Rajah

Reputation: 2484

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

This will sort your collection in descending order based on the date of insertion

Upvotes: 103

Naik Ashwini
Naik Ashwini

Reputation: 808

collection.find().sort('date':1).exec(function(err, doc) {});

this worked for me

referred https://docs.mongodb.org/getting-started/node/query/

Upvotes: 7

emil.c
emil.c

Reputation: 2018

With mongoose it's as simple as:

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

Upvotes: 6

Aouidane Med Amine
Aouidane Med Amine

Reputation: 1691

if your date format is like this : 14/02/1989 ----> you may find some problems

you need to use ISOdate like this :

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

-----> the result ------>ISODate("2012-07-14T08:14:00.201Z")

now just use the query like this :

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

that's it :)

Upvotes: 3

krikara
krikara

Reputation: 2445

Sushant Gupta's answers are a tad bit outdated and don't work anymore.

The following snippet should be like this now :

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

Upvotes: 16

JohnnyHK
JohnnyHK

Reputation: 312149

Sorting by date doesn't require anything special. Just sort by the desired date field of the collection.

Updated for the 1.4.28 node.js native driver, you can sort ascending on datefield using any of the following ways:

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' or 'ascending' can also be used in place of the 1.

To sort descending, use 'desc', 'descending', or -1 in place of the 1.

Upvotes: 49

GoldfishGrenade
GoldfishGrenade

Reputation: 631

This worked for me:

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

Using Node.js, Express.js, and Monk

Upvotes: 12

DB Prasad
DB Prasad

Reputation: 795

Additional Square [ ] Bracket is required for sorting parameter to work.

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

Upvotes: 4

Sushant Gupta
Sushant Gupta

Reputation: 9468

Just a slight modification to @JohnnyHK answer

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

In many use cases we wish to have latest records to be returned (like for latest updates / inserts).

Upvotes: 278

Related Questions