mongodb: как получить последние N записей?



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



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

626   9  

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-find

db.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

    Ничего не найдено.