Nickolay
Nickolay Ovdienko:
Всем привет, у меня небольшая проблема, использую aggregation framework для препарирования и выборки данных, необходимо получать количество документов, у которых некое поле содержит id текущего документа. Был сделан lookup в соседнюю коллекцию, потом получали длину результирующего массива и выносили в поле, затем массив удаляли, на тестах при увеличении объёма данных документы становятся очень большими из-за этого массива и запрос падает, потому что превышаю лимит памяти на документ. Посоветуйте пожалуйста, что можно предпринять в сложившейся ситуации?
Не очень хочется делать два запроса.
Mongo 3.4
Nickolay
Пробовал, время обработки увеличивается в полтора раза :(
Nickolay
В идеале, нужно сделать lookup, но получать не полные документы, а только их id
Nickolay
Их нужно использовать в дальнейшем
yopp
Зачем это всё?
yopp
В смысле какая практическая задача решается
Nickolay
Есть связанные сущности, необходимо рассчитать некоторые связи на уровне запросов, менять схему бд и саму бд строго запрещено.
Есть упростить, то есть школы, и в каждой школе есть какое-то кол-во учеников, ученики постоянно переходят из одной школы в другую и данные о школе хранит ученик. Получая данные о школе необходимо получить кол-во учеников
Nickolay
Аггрегация используется потому что необходимо сортировать данные, например по кол-ву учеников
Nickolay
Либо по названию школы, где в названии могут использоваться символы разного регистра и хранить их уже приведенными и к одному регистру нельзя, это нужно делать каждый запрос. Вот так :(
yopp
Почему нельзя менять схему?
yopp
А какое количество учеников в базе?
Nickolay
Потому что это запрещено, бд неверно спроектирована, да и подобные кейсы больше ложатся на реляционные бд, но необходимо сделать вот так :(
Кол-во учеников больше 300тысяч и постоянно растёт
yopp
Запрещено почему?
yopp
300к печально. Какой размер документа средний?
Nickolay
500кб,если не ошибаюсь, может немногим меньше.
yopp
500к на одного ученика?!
Nickolay
Сейчас скажу точнее
Nickolay
avgObjSize: 461
yopp
А. Так лучше. Итого 150 мегабайт.
yopp
Делать агрегации по коллекции учеников и не накапливать те атрибуты, которые позднее можно вытащить запросом (например список id учеников в школе)
yopp
Например если надо школы по количеству учеников сгруппировать и дальше сортировать, то нужно это делать с коллекцией учеников, а не школ.
yopp
Выбрать пару десятков школ по id — миллисекунды.
Nickolay
А если нужна выборка? Например нужно получить только школы у который имя директора содержит некоторую подстроку?
yopp
Включать в запрос агрегации исключение/вхождение по id школ
yopp
Школ несколько тысяч?
Nickolay
Школ не много, в десятки раз меньше чем учеников, но некоторые ученики могут быть без школы, но это не проблема
Nickolay
И их кол-во почти не растет
yopp
Т.е. сначала сделать запрос по нужным параметрам в коллекцию школ, получить id и включить их в агрегационный запрос к ученикам через in/nin
yopp
А вообще придти и обьяснить что дизайн надо менять.
Nickolay
Спасибо, это действительно выглядит логично
yopp
На это есть время, данные у вас медленные
Nickolay
А, есть ещё нюанс - пагинация, на первый запрос мы можем выдернуть вообще все id
Nickolay
А вернуть нужно всего 20-30
yopp
И что теперь
yopp
Если сортировка требует количества учеников, ваша схема не имеет другого решения.
yopp
На 150мб это не особая проблема
yopp
Проапгредить железо чтоб получить максимальный memory throughput
Nickolay
Спасибо за помощь :)
Ilya
Ilya
Как мне запушить в поле rating что-нибудь?
Anonymous
Экспорт не умеет в tsv? в доках не вижу
Petro
какой способ реализации пагинации самый быстрый? есть документы у которых 5+ полей, _id, name и т.д.
John
gte lte limit
John
Народ, у кого самые нормальные сервера можно арендовать в России?
John
И чтобы ещё была возможность пачку айпи купить не очень дорого
Aleksandr
пока servers.com устраивает
John
Если да, то быстро ли решали?
Aleksandr
один раз их APC вышел из строя. в течении часа решили
John
Пачку айпи купить можно? Канал нормас?
John
Вижу, 97 рублей за штуку в месяц
John
Цены в России анальные, конечно...
P&P
это мягко сказано
Ruslan
Нет 💯 рублей в месяц?
John
12к за E3, 248гб ссд и 32гб рам это чё то дохера
John
Такой конфиг за бугром стоит 4-6к
yopp
180 евро, вполне сносно
yopp
если с хецнером или онлайн.нет не сравнивать
John
Ага, когда на овх цена 60
John
А чем плох онлайн и хетцнер
yopp
а, овх тоже можно к хецнеру и онлайну присунуть
yopp
это дискаунтеры. сравни с ценником ibm например
John
Но сервис то там сносный
yopp
смотря для чего
John
По крайней мере у овх
yopp
у овх с сетью всё как у всех
John
Дедик, паблик Клауд, поддержка
yopp
в любом случае это дискаунтеры
yopp
там за 12к скорее всего не самопал сдают, а какой-то вендорский сервак
John
Ну да, делл какой то
yopp
ну вот теперь сравни сколько делл на хецнере стоит
John
Самое главное чтобы поддержка нормальная была
John
Я наслушался стори про агаву
John
Которая хдд меняла неделю
John
И мне ссыкотно стало
P&P
у меня как раз хецнер и онлайн
P&P
единственно хецнер стал НДС с русских брать
John
Чтобы по 152 ФЗ не было вопросов, нужно будет хоститься в РФ, поэтому хетцнеры, онлайны и овх отпадают
Petro
Ребята, views MongoDB вы юзаете? Или это ненужная фича?