Як сортувати колекцію за датою в MongoDB?


125

Я використовую MongoDB з Node.JS. У мене є колекція, яка містить дату та інші рядки. Дата є Dateоб’єктом JavaScript .

Як можна сортувати цю колекцію за датою?


1
простий, collection.find (). sort ({datefield: 1}, function (помилка, курсор) {...}); або ви також можете використовувати collection.find (). sort ({datefield: -1}, function (помилка, курсор) {...});
— Атул Джайн

Зверніть увагу , що вам , можливо , не потрібен dateстовпець: stackoverflow.com/questions/5125521 / ...
— phil294

Відповіді:


186

Лише незначна зміна відповіді на @JohnnyHK

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

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


1
Що ви маєте намір поставити у функції? Date2.6.3. Спроба сортування об'єктів без функції не працює для мене 2.6.3.
— Сем Брайтман

@SamBrightman Ця функція - лише зворотний виклик. Що б ви не хотіли робити з результатом запиту, ви вводите цю логіку всередині зворотного дзвінка. Ви можете прочитати більше про те, що таке зворотні дзвінки та як вони працюють для вивчення програмування на основі подій.
— Сушант Гупта

Звичайно, я знаю, що таке зворотній дзвінок. Я бачив лише вимогу сортування у запитанні, і всі відповіді дають зворотній зв'язок. У той же час сортування не працювало для мене, тому я подумав, що, можливо, вам доведеться виконати додаткову роботу у функції.
— Сем Брайтман

1
@SamBrightman Ой добре. Для зручності ви можете бути явними та ланцюжковими якcollection.find().sort(...).exec(function(err, cursor) {})
— Sushant Gupta

5
там сказано, що сорт () приймає лише 1 аргумент
— Джітендра Панчолі

39

Сортування за датою не вимагає нічого особливого. Просто відсортуйте за потрібним полем дати колекції.

Оновлений для рідного драйвера 1.4.28 node.js, ви можете сортувати за зростанням, 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.


Я застосовую вище рішення в полі користувача, воно працює нормально, але воно чутливе до регістру Як його ігнорувати?
— Рахул Матте

Правильна відповідь з багатостороннім (у)
— abdulbarik

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

Це сортуватиме вашу колекцію у порядку зменшення залежно від дати вставки


16

Відповіді Сушанта Гупти застаріли і більше не працюють.

Наступний фрагмент повинен бути таким:

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


@JohnnyHK Солодкий. Я не пам’ятаю точного сценарію, але минулого літа я намагався домогтися роботи з фрагментом Sushant, і це просто не працювало для мене. Можливо, це тому, що їй бракувало toArrayчастини.
— krikara

Це насправді неправильна відповідь, вона дає неправильний результат у node.js
— David A



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

З мангустом я не зміг використати 'toArray', і я отримав помилку: TypeError: Collection.find(...).sort(...).toArray is not a function. Функція toArray існує в класі Cursor від драйвера Native MongoDB NodeJS ( посилання ).

Також сортування приймає лише один параметр, тому ви не можете передавати свою функцію всередині нього.

Це працювало для мене (як відповів Еміль ):

collection.find().sort('-date').exec(function(error, result) {
  // Your code
})
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.