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

Почему реализация jQuery недостаточно хороша?

function isNumeric(a) {
    var b = a && a.toString();
    return !$.isArray(a) && b - parseFloat(b) + 1 >= 0;
};

Майкл предложил что-то вроде этого (хотя я украл измененную версию user1691651-John здесь):

function isNumeric(num){
    num = "" + num; //coerce num to be a string
    return !isNaN(num) && !isNaN(parseFloat(num));
}

Ниже приведено решение с наиболее вероятной плохими характеристиками, но надежными результатами. Это приложение, сделанное из реализации jQuery 1.12.4 и ответа Майкла, с дополнительной проверкой для ведущих / конечных пробелов (поскольку версия Майкла возвращает true для чисел с ведущими / конечными пробелами):

function isNumeric(a) {
    var str = a + "";
    var b = a && a.toString();
    return !$.isArray(a) && b - parseFloat(b) + 1 >= 0 &&
           !/^\s+|\s+$/g.test(str) &&
           !isNaN(str) && !isNaN(parseFloat(str));
};

Однако последняя версия имеет две новые переменные. Один из них можно обойти, выполнив:

function isNumeric(a) {
    if ($.isArray(a)) return false;
    var b = a && a.toString();
    a = a + "";
    return b - parseFloat(b) + 1 >= 0 &&
            !/^\s+|\s+$/g.test(a) &&
            !isNaN(a) && !isNaN(parseFloat(a));
};

Я не тестировал ни одного из них очень, другими способами, чем вручную проверять несколько вариантов использования, с которыми я буду бить текущее затруднительное положение, которое является очень стандартным материалом. Это положение «стоящих на плечах гигантов».

448
задан jww 15 December 2018 в 14:42
поделиться

3 ответа

Последние 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)

101
ответ дан JakeGould 15 December 2018 в 14:42
поделиться

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

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

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

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
ответ дан Marty Hirsch 15 December 2018 в 14:42
поделиться

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

Лучшая производительность была бы достигнута, если бы ваша коллекция была проиндексирована по некоторым критериям; и затем вы можете использовать курсор 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/

3
ответ дан João Otero 15 December 2018 в 14:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: