Почему реализация 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));
};
Я не тестировал ни одного из них очень, другими способами, чем вручную проверять несколько вариантов использования, с которыми я буду бить текущее затруднительное положение, которое является очень стандартным материалом. Это положение «стоящих на плечах гигантов».
Последние 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)
Вы не можете «пропустить» в зависимости от размера коллекции, потому что она не будет учитывать условия запроса.
Правильным решением является сортировка от желаемой конечной точки, ограничение размера набора результатов, а затем корректировка порядка результатов при необходимости.
Вот пример, основанный на реальном коде.
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
});
}
});
Сортировка, пропуск и т. Д. Могут быть довольно медленными в зависимости от размера вашей коллекции.
Лучшая производительность была бы достигнута, если бы ваша коллекция была проиндексирована по некоторым критериям; и затем вы можете использовать курсор 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/