Sorting in Mongoose has evolved over the releases such that some of these answers are no longer valid. As of the 4.1.x release of Mongoose, a descending sort on the date
field can be done in any of the following ways:
Room.find({}).sort('-date').exec((err, docs) => { ... });
Room.find({}).sort({date: -1}).exec((err, docs) => { ... });
Room.find({}).sort({date: 'desc'}).exec((err, docs) => { ... });
Room.find({}).sort({date: 'descending'}).exec((err, docs) => { ... });
Room.find({}).sort([['date', -1]]).exec((err, docs) => { ... });
Room.find({}, null, {sort: '-date'}, (err, docs) => { ... });
Room.find({}, null, {sort: {date: -1}}, (err, docs) => { ... });
For an ascending sort, omit the -
prefix on the string version or use values of 1
, asc
, or ascending
.
The correct answer is:
Blah.find({}).sort({date: -1}).execFind(function(err,docs){
});
Been dealing with this issue today using Mongoose 3.5(.2) and none of the answers quite helped me solve this issue. The following code snippet does the trick
Post.find().sort('-posted').find(function (err, posts) {
// user posts array
});
You can send any standard parameters you need to find()
(e.g. where clauses and return fields) but no callback. Without a callback it returns a Query object which you chain sort()
on. You need to call find()
again (with or without more parameters -- shouldn't need any for efficiency reasons) which will allow you to get the result set in your callback.
Post.find().sort({date:-1}, function(err, posts){
});
Should work as well
EDIT:
You can also try using this if you get the error sort() only takes 1 Argument
:
Post.find({}, {
'_id': 0, // select keys to return here
}, {sort: '-date'}, function(err, posts) {
// use it here
});
Error: sort() only takes 1 Argument
Post.find({}, {'_id': 0}).sort("-date").function(err, posts){});
I do this:
Data.find( { $query: { user: req.user }, $orderby: { dateAdded: -1 } } function ( results ) {
...
})
This will show the most recent things first.
$orderby
is deprecated in MongoDB 3.2 so it shouldn't be used anymore.
All the anwsers here are factually correct, however I am writing my anwser to make it clear that sometimes writing '-date' or date: -1 won't work if you either don't have a field named 'date' in your model, or if you passed the option: timestamps: true in options when creating your model. If you are using timestamps: true then you need to type: sort({createdAt: -1}) and this will work then.
See if this helps > How to sort in mongoose?
Also read this > http://www.mongodb.org/display/DOCS/Sorting+and+Natural+Order
Short solution:
const query = {}
const projection = {}
const options = { sort: { id: 1 }, limit: 2, skip: 10 }
Room.find(query, projection, options).exec(function(err, docs) { ... });
This one works for me.
`Post.find().sort({postedon: -1}).find(function (err, sortedposts){
if (err)
return res.status(500).send({ message: "No Posts." });
res.status(200).send({sortedposts : sortedposts});
});`
ES6 solution with Koa.
async recent() {
data = await ReadSchema.find({}, { sort: 'created_at' });
ctx.body = data;
}
You can also sort by the _id
field. For example, to get the most recent record, you can do,
const mostRecentRecord = await db.collection.findOne().sort({ _id: -1 });
It's much quicker too, because I'm more than willing to bet that your date
field is not indexed.
Success story sharing
Query#find([criteria], [callback])
. I thought maybe there was some secret handshake that says "criteria" can be up to three arguments, but it lists the type as "Object".find
method in the docs. SeeModel.find
.Module#property
notation and searched for#find
. It seems there is no easy way to navigate or search the docs. Searching for find yields 187 results._id
field. For example, to get the most recent record, you can do:await db.collection.findOne().sort({ _id: -1 });