2013-11-29 3 views
4

Примечание: Я видел other question и пытался получить ответы от него без везения.Выберите последние N записей из MongoDB, используя node.js

У меня есть коллекция в MongoDB:

{ _id: 1, category_id: 1, time_added: 1234567890, name: "abc" } 

Мне нужно найти последние 10 записей из category_id равных . Звучит просто?

collection.find({ 'category_id': 10 }, {}, { _id: -1, limit : 10}, function (e, d) {}); 

Но работает это дает мне первые 10 записей вместо последнего 10. Похоже, водитель имеет приоритет «предел», а не «сортировки» ... Я также пытается с $natural и сортировки на time_added. Всякий раз, когда я запускаю тот же запрос из командной строки, я получаю то, что мне нужно. Вот что я набираю в командной строке:

collection.find({ 'category_id': 10 }).sort({_id: -1}).limit(10) 

Что я делаю неправильно? Есть ли альтернативный способ сделать это с помощью node.js?

+1

Вы используете [узел-MongoDB-родной] драйвер (https://github.com/mongodb/node-mongodb-native)? Он поддерживает цепочный метод 'sort', позволяющий вам выдать запрос драйверу так же, как и вашу командную строку. –

+0

@RayToal Да. Я использую этот драйвер. Где я могу поместить обратный вызов? В пределе как последний параметр? Что делать, если я удаляю .limit(), могу ли я разместить обратный вызов в любой функции в качестве последнего параметра? Постскриптум Я пробовал, и это сработало. Добавьте это как ответ, чтобы я мог его принять. – Xeos

+0

@Xeos - вы можете добавить ответ и отметить его как ответ. – WiredPrairie

ответ

4

Выключает node.js принимает вызовы функций таким же образом, как это делает интерфейс командной строки. Каждая функция имеет последний необязательный аргумент в качестве функции обратного вызова. Так что этот код работает и возвращает правильные результаты:

collection.find({ 'category_id': 10 }).sort({_id: -1}).limit(10, function (e, d) {}) 
+0

Вы уверены, что сортировка по полю _id в порядке. Я думал, что это случайный ориентир ... –

+0

@ G.Ghez Это совсем не случайно. Вот описание ObjectId http://docs.mongodb.org/manual/reference/object-id/ Когда я сортирую ObjectId, я по существу сортирую его по метке времени. Кроме того, если в течение одной секунды было несколько вставок, то есть счетчик. Это работает очень хорошо для настройки одного сервера. Он не будет работать с несколькими серверами, поскольку идентификаторы машин и процессов будут конфликтовать с хронологическим упорядочением. – Xeos

+0

Благодарим вас за обмен, а затем ^^ –

Смежные вопросы