В Mongoose, как сортировать по дате? (Node.js)

161

скажем, я запускаю этот запрос в Mongoose:

Room.find({}, function(err,docs){

}).sort({date:-1}); 

Это не работает!

TIMEX
источник

Ответы:

429

Сортировка в Mongoose развивалась по релизам, так что некоторые из этих ответов больше не действительны. Начиная с версии 4.1.x Mongoose сортировка по dateполю по убыванию может выполняться любым из следующих способов:

Room.find({}).sort('-date').exec(function(err, docs) { ... });
Room.find({}).sort({date: -1}).exec(function(err, docs) { ... });
Room.find({}).sort({date: 'desc'}).exec(function(err, docs) { ... });
Room.find({}).sort({date: 'descending'}).exec(function(err, docs) { ... });
Room.find({}).sort([['date', -1]]).exec(function(err, docs) { ... });
Room.find({}, null, {sort: '-date'}, function(err, docs) { ... });
Room.find({}, null, {sort: {date: -1}}, function(err, docs) { ... });

Для сортировки по возрастанию, опустить -префикс на строку версии или используйте значение 1, ascили ascending.

JohnnyHK
источник
1
+1 за показ тонны разных способов это можно сделать. Однако я не могу найти в документах, что Query # find будет принимать столько аргументов. Подпись есть Query#find([criteria], [callback]). Я подумал, что, может быть, было какое-то секретное рукопожатие, в котором говорится, что «критерий» может содержать до трех аргументов, но в нем указан тип «Объект».
Nateowami
@Nateowami Вы смотрите неправильный findметод в документах. См Model.find.
JohnnyHK
1
Ты прав. Я видел, что они использовали Module#propertyобозначение и искал #find. Кажется, нет простого способа навигации или поиска в документах. Поиск находки дает 187 результатов.
Nateowami
2
Вы также можете сортировать по _idполю. Например, чтобы получить самую последнюю запись, вы можете сделать:await db.collection.findOne().sort({ _id: -1 });
Mike K
53

Правильный ответ:

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

});
TIMEX
источник
13
обновленный синтаксис сортировки для приведенного выше примера: sort ('- date') mongoosejs.com/docs/api.html#query_Query-sort
emilebaizel
3
Этот не работал для меня. Я получаю сообщение об ошибке «User.find (...). Sort (...). ExecFind не является функцией»
Sandip Subedi
12

Я имел дело с этой проблемой сегодня, используя Mongoose 3.5 (.2), ​​и ни один из ответов не помог мне решить эту проблему. Следующий фрагмент кода делает свое дело

Post.find().sort('-posted').find(function (err, posts) {
    // user posts array
});

Вы можете отправить любые стандартные параметры, которые вам нужны find()(например, где пункты и возвращаемые поля), но без обратного вызова. Без обратного вызова он возвращает объект Query, с которым вы связываетесь sort(). Вам нужно позвонить find()снова (с дополнительными параметрами или без них - в целях эффективности они не нужны), что позволит вам получить набор результатов в вашем обратном вызове.

Джимми Хиллис
источник
4

Я сделаю это:

Data.find( { $query: { user: req.user }, $orderby: { dateAdded: -1 } } function ( results ) {
    ...
})

Это покажет самые последние вещи в первую очередь.

Ной
источник
1
$orderbyустарела в MongoDB 3.2, поэтому больше не должна использоваться.
JohnnyHK
4
Post.find().sort({date:-1}, function(err, posts){
});

Должно работать так же

РЕДАКТИРОВАТЬ:

Вы также можете попробовать использовать это, если вы получите ошибку sort() only takes 1 Argument:

Post.find({}, {
    '_id': 0,    // select keys to return here
}, {sort: '-date'}, function(err, posts) {
    // use it here
});
lynx_vbg
источник
1
это дает мне ошибку:Error: sort() only takes 1 Argument
18:18
@ LukeXF, пожалуйста, смотрите обновленный ответ. я надеюсь, что это поможет вам :)
mrid
@mrid это должно быть похоже на: Post.find({}, {'_id': 0}).sort("-date").function(err, posts){});
Мостафа Гадими
2

Краткое решение:

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

Room.find(query, projection, options).exec(function(err, docs) { ... });
davidsonsns
источник
1

Посмотрите, поможет ли это> Как сортировать в мангусте?

Также читайте это> http://www.mongodb.org/display/DOCS/Sorting+and+Natural+Order

neebz
источник
Этот первый метод не работает. Он просто зависает ... Я думаю, что это из-за обновления в mongoose .... И 2-й способ - это просто документы на mongo, о которых я знаю.
TIMEX
Функция find () - это функция MongoDB, а не Mongoose. Пожалуйста, прочитайте страницу API Mongoose для более подробной информации. Вы можете использовать синтаксис, определенный в документации MongoDB с Mongoose. Вот почему Mongoose не имеет своей собственной сортировки или пересекающихся запросов.
neebz
0

Вы также можете сортировать по _idполю. Например, чтобы получить самую последнюю запись, вы можете сделать,

const mostRecentRecord = await db.collection.findOne().sort({ _id: -1 });

Это гораздо быстрее, потому что я более чем готов поспорить, что ваше dateполе не проиндексировано.

Майк К
источник
0

Этот работает для меня.

`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});
 });`
Усама Тахир
источник