ChatGPT解决这个技术问题 Extra ChatGPT

In Mongoose, how do I sort by date? (node.js)

let's say I run this query in Mongoose:

    Room.find({}, (err,docs) => {
    
    }).sort({date:-1}); 

This doesn't work!


M
Minsky

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.


+1 for showing tons of different ways it can be done. However, I can't find in the docs that Query#find will take that many arguments. The signature is 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".
@Nateowami You're looking at the wrong find method in the docs. See Model.find.
You're right. I saw they were using the 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.
You can also sort by the _id field. For example, to get the most recent record, you can do: await db.collection.findOne().sort({ _id: -1 });
T
Timm

The correct answer is:

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

});

the updated sort syntax for the example above is: sort('-date') mongoosejs.com/docs/api.html#query_Query-sort
This one did not work for me. I am getting an error "User.find(...).sort(...).execFind is not a function"
J
Jimmy Hillis

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.


m
mrid
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
});

this gives me the error: Error: sort() only takes 1 Argument
@LukeXF please see the updated answer. i hope it helps you :)
@mrid it should be like: Post.find({}, {'_id': 0}).sort("-date").function(err, posts){});
N
Noah

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.
m
ms3300

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.


C
Community

See if this helps > How to sort in mongoose?

Also read this > http://www.mongodb.org/display/DOCS/Sorting+and+Natural+Order


That 1st method doesn't work. It just hangs...I think it's because of an update in mongoose.... And the 2nd method is just the mongo docs, which I know about.
The find() function is MongoDB's function, not Mongoose. Please read Mongoose API page for more details You can use the syntax defined in MongoDB docs with Mongoose. That's why Mongoose doesn't have its own sorting or intersect queries.
d
davidsonsns

Short solution:

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

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

U
Usama Tahir

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});
 });`

c
chovy

ES6 solution with Koa.

  async recent() {
    data = await ReadSchema.find({}, { sort: 'created_at' });
    ctx.body = data;
  }

M
Mike K

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.