Як сортувати колекцію за датою в 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.