Як сортувати за датою в монгузі (node.js)


161

скажімо, я запускаю цей запит у Мангузі:

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

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

Це не працює!

Відповіді:


429

Сортування в "Мангуста" розвинулось над випусками таким чином, що деякі з цих відповідей більше не є дійсними. З моменту випуску "Mongoose" 4.1.x , сортування на 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.


1
+1 для показу тонн різних способів це можна зробити. Однак я не можу знайти у документах, що Query # знайде стільки аргументів. Підпис є 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 });
Майк К

53

Правильна відповідь:

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

});

13
оновлений синтаксис сортування для прикладу вище: sort ('- дата') mongoosejs.com/docs/api.html#query_Query-sort
emilebaizel

3
Цей для мене не працював. Я отримую повідомлення про помилку "User.find (...) сорт (...) execFind не є функцією .."
Sandip Субедей

12

Сьогодні я займався цим питанням, використовуючи Mongoose 3.5 (.2), ​​і жодна з відповідей не допомогла мені вирішити це питання. Наступний фрагмент коду виконує цю справу

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

Ви можете надіслати будь-які стандартні параметри, які вам потрібні find()(наприклад, де пункти та поля повернення), але немає зворотного дзвінка. Без зворотного дзвінка він повертає об’єкт Запиту, на який ви ланцюжок 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
});

1
це дає мені помилку:Error: sort() only takes 1 Argument
1818

@LukeXF, будь ласка, дивіться оновлену відповідь. Я сподіваюся, що це допоможе вам :)
'18

@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) { ... });

1

Подивіться, чи це допомагає> Як сортувати мангуста?

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


Цей 1-й метод не працює. Він просто зависає ... Я думаю, це через оновлення в мангусті .... І другий метод - це лише документи монго, про які я знаю.
TIMEX

Функція find () - це функція MongoDB, а не Mongoose. Будь ласка, прочитайте сторінку API Mongoose для отримання більш детальної інформації Ви можете використовувати синтаксис, визначений у документах MongoDB, з Mongoose. Ось чому у Mongoose немає власних запитів щодо сортування чи пересічення.
neebz

0

Ви також можете сортувати за _idполями. Наприклад, щоб отримати останній запис, ви можете зробити це,

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

Це набагато швидше, тому що я більше ніж готовий зробити ставку, що ваше dateполе не індексується.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.