yopp
Если ты знаешь что гуглить, то вместо того чтоб оставлять человека один на один с поисковыми результатми, потрать 30 секунд и дай ссылку на конкретный материал, который отвечает на вопрос
yopp
Потому что не факт что поисковых результатах будет ответ на вопрос, не факт что это будет правильный ответ на вопрос и не факт что ответ будет понятный
Artem [GMT+2]
@Yopp @icerly спасибо!
Dmitriy
работает просто и эффективно
Anonymous
Спасибо. Мне пока нравится моя ссылка больше, там $slice кусочка коллекции от и до от+число строк на страницу.
Anonymous
Но: читал, что $push: '$$ROOT' при большой коллекции вызывает в Монго некую ошибку. У меня 300 000 доков.
Anonymous
Anonymous
Есть способ вернуть часть коллекции от и до, помимо skip и limit? Пытаюсь приспособить для этого $slice.
Anonymous
При перемещении по пагинации таблицы, т. е. при кликах по кнопках пагинации, отправлять запрос в БД и подбирать очередные 10 (пока фиксированное число) записей.
Сейчас для начала пишу запрос, который бы возвращал документы с индексами от и до, хочется написать его без использования skip и limit, т. к. они пробегают по всей коллекции.
yopp
Dmitriy
вы делаете преждевременную оптимизацию, о которой я говорил выше)
Dmitriy
вообще ваша задача решается через использование $lt и $gte по какому-то ключу, но подозреваю, что этого ключа у вас в документе сейчас нет
Anonymous
Возможно передать в $match в aggregate пустой объект {}? Чтобы получить все документы в коллекции. Аналогичнo коллекция.find({}).
Anonymous
Судя по первому блоку кода в https://stackoverflow.com/a/53220591/5524590, можно.
Mike
Что то не пойму речь о паджинации идёт или нет. Сколько не видел разных вариантов, все skip и limit используют. Хоть в мускуле хоть в оракле
Dmitriy
Anonymous
А зачем вам вообще стейдж с матчем в пайплайне, если вам нужны все документы?)
Сейчас пробую получать очередные 10 документов по клику на кнопку пагинации. Цифра на этой кнопке, т. е. номер текущей страницы, это const currentPage в коде ниже.
router.get('/test/subs/:current_page', async (req, res) => {
const RESULTS_PER_PAGE = 10;
const currentPage = req.params.current_page;
try {
const docs = await Subscription
.aggregate([
{ "$facet": {
"records": [
{ "$match": {} },
{ "$skip": (currentPage - 1) * RESULTS_PER_PAGE },
{ "$limit": RESULTS_PER_PAGE }
],
"count": [
{ "$count": "count" }
]
} }
]);
res.status(200).json({ docs });
} catch(ex) {
console.log('error fetching docs from Subscription:', ex.message);
res.status(500).json({ message: 'error fetching docs from Subscription' });
}
});
Этот серверный роут будет получать запросы от фронта и возвращать текущий кусочек коллекции и размер всей коллекции.
Dmitriy
Сейчас пробую получать очередные 10 документов по клику на кнопку пагинации. Цифра на этой кнопке, т. е. номер текущей страницы, это const currentPage в коде ниже.
router.get('/test/subs/:current_page', async (req, res) => {
const RESULTS_PER_PAGE = 10;
const currentPage = req.params.current_page;
try {
const docs = await Subscription
.aggregate([
{ "$facet": {
"records": [
{ "$match": {} },
{ "$skip": (currentPage - 1) * RESULTS_PER_PAGE },
{ "$limit": RESULTS_PER_PAGE }
],
"count": [
{ "$count": "count" }
]
} }
]);
res.status(200).json({ docs });
} catch(ex) {
console.log('error fetching docs from Subscription:', ex.message);
res.status(500).json({ message: 'error fetching docs from Subscription' });
}
});
Этот серверный роут будет получать запросы от фронта и возвращать текущий кусочек коллекции и размер всей коллекции.
Честно выглядит как лютый оверхэд. Фасет, пустой матч, зачем? Вы меряли производительность и эти замеры показали, что ваш АФ работает эффективней чем 2 маленьких коротких запроса на count и find?
Anonymous
Вероятно, вы правы.
Anonymous
Правильная идея на фронте при перемещении по пагинации таблицы на каждом запросе помимо данных для таблицы получать размер всей коллекции?
Anonymous
Размер коллекции не меняется. Лимит документов на страницу таблицы на фронте будет чуть позже, это будет выпадающиее меню "столько-то строк" (отображать).
Как кешиpовать count?
Anonymous
Node.js на сервере, React на фронте.
Anonymous
Node.js 1-поточен по дефолту.
Anonymous
Спасибо.
Dmitriy
Node.js 1-поточен по дефолту.
Ну тогда если у вас одна нода, т.е. нет необходимости синхронизации кэша между разными нодами приложения, то сделайте глобальный объект с полем count и в нем храните кэшированное значение количества документов
Anonymous
Глобальный объект на беке?
yopp
Dmitriy
зачем
Чтобы избавится от одного запроса, который и так судя по тому что человек пишет будет возвращать одно и тоже значение
yopp
зачем
Dmitriy
Экономия на спичках, но это не обязательно конечно, об этом я тоже выше писал)
Anonymous
Спасибо всем за участие и информацию. Хорошего завтра.
Artem
Всем привет. Подскажите как лучше хранить данные из 1-20 тысячи элементов массива (цифры, спарсенные айди)? У меня в голове крутятся такие варианты: текстовый файл, mongodb таблица где будет тип Object и туда загонять, но не знаю разумно ли это, ну или создавать для каждого элемента свой документ в таблице. Использоваться это будет только в скрипте, одновременно будет работать с этими данными 1 процесс. Что скажете?
yopp
yopp
чтоб монгу с собой не таскать
Artem
yopp
в npm скорее всего есть биндинги
yopp
зависит от выборок, которые вы хотите делать
yopp
если вам не нужен поиск по значению, а доступ по ключам простой, key/value хранилища типа rocksdb или другое embedded будет достаточно. возможно в ноду уже что-то встроено
если у вас сложные запросы, разные измерения по которым вы хотите делать выборки, то sqlite
Artem
Egor
yopp
Artem
yopp
rocksdb это просто key/value хранилище
yopp
это бибилиотека, так что вы его встраиваете в своё прилоежние
yopp
но оно ничего кроме put/get/scan/delete не умеет
yopp
в вашей задаче было про 1 процесс
Dmitriy
Роксдб это про один инстанс на одну ноду, если нужно масштабирование, то встанет вопрос про синхронизацию. Если смотрите на кей валуе хранилище с замахом на масштабирование, то либо редис (и возможно редис кластер), либо аероспайк. Других хороших вариантов не особо на рынке
yopp
сомневаюсь
Artem
yopp
что проблема масшабировния у вас всего вообще стоит в ближайшем времени.
вам нужно определиться только с тем, какое количество потребителей данных у вас будет.
если у вас будет множество потребителей, то какое-то сетевое хранилеще будет удобнее.
если у вас это какой-то скрипт, бот или ещё какое-то приложение работающее в единственном экземпляре, то можно и сетевое, и встроенное хранилище
yopp
пытаться оптимизировать то, чего у вас ещё нет — бессмыслено
Dmitriy
yopp
для ваших объёмов подойдёт абсолютно любое хранилище. выбирайте по тому, насколько хранилище помогает легко получить доступ к тем данных, которые вам нужны
yopp
проблемы с масштабированием это хороший вид проблем, которй говорит что у вас есть нужный кому-то продукт. а это очень поздняя стадия, до которой 99% продуктов просто не доходят
Artem
В ближайшие пару месяцев может и не будет больших объемов, но потом будет и что, переписывать логику всю?
Dmitriy
yopp
yopp
http://wiki.c2.com/?PrematureOptimization
Dmitriy
В первую очередь смотрите на дешевизну запуска, как начнут идти реальные деньги и проблемы с ними. Вы будете за эти деньги решать эти проблемы
Dmitriy
Иначе вы работаете в минус себе или компании
yopp
Радует что я не один про это теперь ною
yopp
TL;DR: возьмите то, с чем вы знакомы и быстро запилите то, что вы хотите
yopp
быстрее запилите, быстрее поймёте что вам реально надо
yopp
если пилить быстро, инвестиции минимальные
yopp
а значит и выкинуть если что не жалко
yopp
у меня обычно это выглядит как-то так
Artem
yopp
это в гит репозитории