Как отсортировать коллекцию по дате в 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.


Я применяю указанное выше решение в поле имени пользователя. Оно работает нормально, но чувствительно к регистру. Как его игнорировать?
Рахул Мэтт,

Правильный ответ с несколькими путями (y)
abdulbarik

30
db.getCollection('').find({}).sort({_id:-1}) 

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


16

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

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

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


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

На самом деле это неправильный ответ, он дает неверный результат в node.js
Дэвид А.

12

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

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

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



5

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

collection.find().sort('-date').exec(function(err, collectionItems) {
  // here's your code
})

4

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

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

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

Это оно :)


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
})
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.