Как отсортировать коллекцию по дате в MongoDB?

125

Я использую MongoDB с Node.JS. У меня есть коллекция, содержащая дату и другие строки. Дата - это Dateобъект JavaScript .

Как отсортировать эту коллекцию по дате?

течь
источник
1
простой, collection.find (). sort ({datefield: 1}, function (err, cursor) {...}); или вы также можете использовать collection.find (). sort ({datefield: -1}, function (err, cursor) {...});
Атул Джайн
Обратите внимание, что вам может не понадобиться dateстолбец: stackoverflow.com/questions/5125521/…
phil294

Ответы:

187

Просто небольшая модификация ответа @JohnnyHK

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

Во многих случаях использования мы хотим, чтобы возвращались последние записи (например, для последних обновлений / вставок).

Сушант Гупта
источник
1
Что вы собираетесь добавить в функцию? Простая попытка сортировки Dateобъектов без функции у меня не работает в 2.6.3.
Сэм Брайтман
@SamBrightman Эта функция - просто обратный вызов. Что бы вы ни хотели сделать с результатом запроса, вы помещаете эту логику в свой обратный вызов. Вы можете узнать больше о том, что такое обратные вызовы и как они работают, чтобы изучить программирование на основе событий.
Sushant Gupta
Конечно, я знаю, что такое обратный вызов. Я видел только требование сортировки в вопросе, и все ответы содержат обратные вызовы. В то же время сортировка у меня не работала, поэтому я подумал, что, может быть, вам нужно проделать дополнительную работу в функции.
Сэм Брайтман
1
@ SamBrightman О, ладно. Для удобства вы можете быть откровенным и collection.find().sort(...).exec(function(err, cursor) {})
цепочным
5
он говорит, что sort () принимает только 1 аргумент
Джитендра Панчоли
39

Сортировка по дате ничего особенного не требует. Просто отсортируйте по желаемому полю даты коллекции.

Обновлено для нативного драйвера node.js 1.4.28, вы можете сортировать по возрастанию datefieldодним из следующих способов:

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'или 'ascending'также может использоваться вместо 1.

Для сортировки по убыванию, использование 'desc', 'descending'или -1на месте 1.

JohnnyHK
источник
Я применяю указанное выше решение в поле имени пользователя. Оно работает нормально, но чувствительно к регистру. Как его игнорировать?
Рахул Мэтт,
Правильный ответ с несколькими путями (y)
abdulbarik
30
db.getCollection('').find({}).sort({_id:-1}) 

Это отсортирует вашу коллекцию в порядке убывания в зависимости от даты вставки.

Богатый раджа
источник
16

Ответы Сушанта Гупты немного устарели и больше не работают.

Следующий фрагмент должен быть таким:

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

krikara
источник
@JohnnyHK Sweet. Я не помню точного сценария, но прошлым летом я пытался заставить этот вид работать с фрагментом Sushant, и он просто не работал у меня. Возможно, это потому, что ей не хватало роли toArray.
krikara
На самом деле это неправильный ответ, он дает неверный результат в node.js
Дэвид А.
12

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

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

Использование Node.js, Express.js и Monk

GoldfishGrenade
источник
5

С мангустом это очень просто:

collection.find().sort('-date').exec(function(err, collectionItems) {
  // here's your code
})
emil.c
источник
4

Для работы параметра сортировки требуется дополнительная квадратная скобка [] .

collection.find({}, {"sort" : [['datefield', 'asc']]} ).toArray(function(err,docs) {});
DB Prasad
источник
2

если ваш формат даты такой: 14.02.1989 ----> вы можете столкнуться с некоторыми проблемами

вам нужно использовать ISOdate следующим образом:

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

-----> результат ------> ISODate ("2012-07-14T08: 14: 00.201Z")

теперь просто используйте такой запрос:

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

Это оно :)

Amine_Dev
источник
2

С mongoose я не смог использовать toArray и получал ошибку: TypeError: Collection.find(...).sort(...).toArray is not a function. функция toArray существует в классе Cursor из собственного драйвера MongoDB NodeJS ( ссылка ).

Также sort принимает только один параметр, поэтому вы не можете передавать свою функцию внутри него.

Это сработало для меня (как ответил Эмиль ):

collection.find().sort('-date').exec(function(error, result) {
  // Your code
})
Пранш Тивари
источник