mongodb: как получить последние N записей?
Я не могу найти нигде документально это. По умолчанию операция find () получает записи с самого начала. Как я могу получить последние N записей в mongodb?
Edit: также я хочу, чтобы возвращенный результат был упорядочен от менее недавнего до самого последнего, а не наоборот.
9 ответов:
если я понимаю ваш вопрос, вам нужно сортировать в порядке возрастания.
предполагая, что у вас есть какой-то идентификатор или поле даты под названием "x" вы бы сделали ...
.сортировка ()
db.foo.find().sort({x:1});The 1 будет сортировать по возрастанию (от старого до нового) и -1 сортировка по убыванию (от самого Нового до самого старого.)
если вы используете автоматически созданный параметр _id поле в него встроена дата... так что вы можете использовать это, чтобы заказать ...
db.foo.find().sort({_id:1});это вернет все ваши документы, отсортированные от старейших до новейших.
Естественный Порядок
вы также можете использовать Естественный Порядок упоминалось выше ...
db.foo.find().sort({$natural:1});опять же, с помощью 1 или -1 в зависимости от того, что вы хотите.
использовать .limit ()
наконец, это хорошая практика, чтобы добавить ограничение при выполнении такого рода широко открытых запросов, так что вы может сделать что-либо ...
db.foo.find().sort({_id:1}).limit(50);или
db.foo.find().sort({$natural:1}).limit(50);
последние N добавленные записи, от менее последних до самых последних, можно увидеть с помощью этого запроса:
db.collection.find().skip(db.collection.count() - N)если вы хотите их в обратном порядке:
db.collection.find().sort({ $natural: -1 }).limit(N)при установке Монго-Хакер вы также можете использовать:
db.collection.find().reverse().limit(N)если вы устали от написания этих команд все время вы можете создавать пользовательские функции в вашем ~/.монгорк.js. Е. Г.
function last(N) { return db.collection.find().skip(db.collection.count() - N); }затем из оболочки mongo просто введите
last(N)
чтобы получить последние N записей, вы можете выполнить следующий запрос:
db.yourcollectionname.find({$query: {}, $orderby: {$natural : -1}}).limit(yournumber)Если вы хотите только одну последнюю запись:
db.yourcollectionname.findOne({$query: {}, $orderby: {$natural : -1}})Примечание: вместо $natural вы можете использовать один из столбцов из вашей коллекции.
можно использовать
sort(),limit(),skip()чтобы получить последнюю запись N, начните с любого пропущенного значенияdb.collections.find().sort(key:value).limit(int value).skip(some int value);
вы не можете" пропустить " на основе размера коллекции, потому что он не будет учитывать условия запроса.
правильное решение состоит в том, чтобы отсортировать от желаемой конечной точки, ограничить размер результирующего набора, а затем при необходимости настроить порядок результатов.
вот пример, основанный на реальном коде.
var query = collection.find( { conditions } ).sort({$natural : -1}).limit(N); query.exec(function(err, results) { if (err) { } else if (results.length == 0) { } else { results.reverse(); // put the results into the desired order results.forEach(function(result) { // do something with each result }); } });
посмотрите под запрос: сортировка и естественный порядок,http://www.mongodb.org/display/DOCS/Sorting+и + естественный + порядок а также сортировать() под методами Курсора http://www.mongodb.org/display/DOCS/Advanced + запросы
вы можете использовать
findпараметры : http://docs.meteor.com/api/collections.html#Mongo-Collection-finddb.collection.find({}, {sort: {createdAt: -1}, skip:2, limit: 18}).fetch();
@bin-chen,
вы можете использовать агрегацию для последних n записей подмножества документов в коллекции. Вот упрощенный пример без группировки (что вы будете делать между этапами 4 и 5 в этом случае).
это возвращает последние 20 записей (на основе поля под названием "метка времени"), отсортированных по возрастанию. Затем он проецирует каждый documents _id, timestamp и whatever_field_you_want_to_show в результаты.
var pipeline = [ { "$match": { //stage 1: filter out a subset "first_field": "needs to have this value", "second_field": "needs to be this" } }, { "$sort": { //stage 2: sort the remainder last-first "timestamp": -1 } }, { "$limit": 20 //stage 3: keep only 20 of the descending order subset }, { "$sort": { "rt": 1 //stage 4: sort back to ascending order } }, { "$project": { //stage 5: add any fields you want to show in your results "_id": 1, "timestamp" : 1, "whatever_field_you_want_to_show": 1 } } ] yourcollection.aggregate(pipeline, function resultCallBack(err, result) { // account for (err) // do something with (result) }Итак, результат будет посмотрите что-то вроде:
{ "_id" : ObjectId("5ac5b878a1deg18asdafb060"), "timestamp" : "2018-04-05T05:47:37.045Z", "whatever_field_you_want_to_show" : -3.46000003814697 } { "_id" : ObjectId("5ac5b878a1de1adsweafb05f"), "timestamp" : "2018-04-05T05:47:38.187Z", "whatever_field_you_want_to_show" : -4.13000011444092 }надеюсь, что это помогает.
последняя функция должна быть
sort, а неlimit.пример:
db.testcollection.find().limit(3).sort({timestamp:-1});
Comments