Как получить последние N записей в mongodb? - PullRequest
447 голосов
/ 12 декабря 2010

Я не могу найти нигде, это было задокументировано.По умолчанию операция find () будет получать записи с начала.Как я могу получить последние N записей в mongodb?

Редактировать: также я хочу, чтобы возвращаемый результат упорядочивался от менее недавнего к самому последнему, а не наоборот.

Ответы [ 13 ]

637 голосов
/ 13 декабря 2010

Если я понимаю ваш вопрос, вам нужно отсортировать по возрастанию.

Предполагая, что у вас есть поле идентификатора или даты с именем "x", вы бы сделали ...

.sort ()


db.foo.find().sort({x:1});

1 будет сортировать по возрастанию (от самого старого к новейшему), а -1 будет сортировать по убыванию (от самого нового к старшему.)

Если вы используете автоматически созданное поле _id , в него встроена дата ... так что вы можете использовать это для заказа по ...

db.foo.find().sort({_id:1});

Это вернет обратно все ваши документы, отсортированные от самых старых до самых новых.

Природный заказ


Вы также можете использовать Natural Order , упомянутый выше ...

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);
100 голосов
/ 06 марта 2014

Последние N добавленные записи, от менее недавних до самых последних, можно увидеть с помощью этого запроса:

db.collection.find().skip(db.collection.count() - N)

Если вы хотите их в обратном порядке:

db.collection.find().sort({ $natural: -1 }).limit(N)

Если вы устанавливаете Mongo-Hacker , вы также можете использовать:

db.collection.find().reverse().limit(N)

Если вам надоело постоянно писать эти команды, вы можете создавать собственные функции в ~ / .mongorc.js. Э.Г.

function last(N) {
    return db.collection.find().skip(db.collection.count() - N);
}

затем из оболочки монго просто наберите last(N)

13 голосов
/ 24 июля 2014

Чтобы получить последние N записей, вы можете выполнить следующий запрос:

db.yourcollectionname.find({$query: {}, $orderby: {$natural : -1}}).limit(yournumber)

, если вы хотите только одну последнюю запись:

db.yourcollectionname.findOne({$query: {}, $orderby: {$natural : -1}})

Примечание. Вместо $ natural можно использовать один из столбцов из вашей коллекции.

6 голосов
/ 11 марта 2013

вы можете использовать sort(), limit(), skip(), чтобы получить начало N последней записи из любого пропущенного значения

db.collections.find().sort(key:value).limit(int value).skip(some int value);
5 голосов
/ 13 октября 2014

Нельзя «пропустить» в зависимости от размера коллекции, поскольку она не будет учитывать условия запроса.

Правильным решением является сортировка по желаемой конечной точке, ограничениеразмер набора результатов, затем при необходимости измените порядок результатов.

Вот пример, основанный на реальном коде.

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
        });
    }
});
5 голосов
/ 12 декабря 2010

Смотрите в разделе Запросы: сортировка и естественный порядок, http://www.mongodb.org/display/DOCS/Sorting+and+Natural+Order, а также sort () в разделе Методы курсора http://www.mongodb.org/display/DOCS/Advanced+Queries

4 голосов
/ 23 января 2019

Вы можете попробовать этот метод:

Получить общее количество записей в коллекции с помощью

db.dbcollection.count() 

Затем используйте skip:

db.dbcollection.find().skip(db.dbcollection.count() - 1).pretty()
3 голосов
/ 02 января 2019

Сортировка, пропуск и т. Д. Могут быть довольно медленными в зависимости от размера вашей коллекции.

Лучшая производительность будет достигнута, если ваша коллекция проиндексирована по некоторым критериям;и затем вы можете использовать курсор min ():

Сначала индексируйте свою коллекцию с помощью db.collectionName.setIndex( yourIndex ) Вы можете использовать возрастающий или нисходящий порядок, что здорово, потому что вы всегда хотите, чтобы "N последних элементов" ...так что если вы индексируете в порядке убывания, это аналогично получению «первых N элементов».

Затем вы находите первый элемент вашей коллекции и используете значения его индексного поля в качестве минимальных критериев поиска:

db.collectionName.find().min(minCriteria).hint(yourIndex).limit(N)

Вот ссылка для курсора min (): https://docs.mongodb.com/manual/reference/method/cursor.min/

2 голосов
/ 05 апреля 2018

@ bin-chen,

Вы можете использовать агрегацию для последних n записей подмножества документов в собрании.Вот упрощенный пример без группировки (в данном случае вы будете делать это между этапами 4 и 5).

Возвращает последние 20 записей (основанные на поле с именем timestamp), отсортированные по возрастанию.Затем он проецирует каждый документ _id, timestamp и what_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
}

Надеюсь, это поможет.

2 голосов
/ 06 декабря 2017

Возможно, вы захотите использовать опции find: http://docs.meteor.com/api/collections.html#Mongo-Collection-find

db.collection.find({}, {sort: {createdAt: -1}, skip:2, limit: 18}).fetch();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...