Сергей
нет, 100% не find_one
Сергей
т.к. запрос динамический и в него приходят переменные из других мест и там результаты долеки от одной строки
Nickolay
покажите запросы которые отправляете
Игорь
подскажите, если у меня запрос find по двум полям. запрос find({$and: [ {$or: [ {'category': {$in: [16, 17, 18, 19]}}, {'kind': {$in: [21373754,21373763,21373768]}} ] }, {'kind': {$nin: [23,24,25,26]}} ] } ) В ощем случае, то что поле используеться и в $in и потом $nin как-то повлияет на посторение индекса? сейчас создал индекс kind, category.
Nick
explain в помощь
Alexander
И проверьте ещё какое поле даёт большее сужение поиска для следующего условия
Oleg
Ребята, привет. Подскажите, какой правильный и безопасный путь сжатия места в реплика сете, после дропания данных на всех мемберах
Oleg
буду благодарен за подсказки
Eugene
Как описать в схеме монгуса массив объектов?
Игорь
explain в помощь
explain показывает "inputStage" : { "stage" : "IXSCAN",
Nick
вот и ответили на свой вопрос
Игорь
на всех трех этапах
Nick
Как описать в схеме монгуса массив объектов?
зайти в доки по могусу и почитат ькак описывается массив объектов, там на это сделан отдельный упор
Сергей
покажите запросы которые отправляете
{ 'mfr_step' => 'mfr_needles', 'mcu_id' => '390032001257345630373420' } Вот такой find_query в логе
Nick
а есть такой докуент в базе?
Сергей
да, конечно
Сергей
они у меня в таблицу на сайте выводятся
Сергей
я там делаю фильтр
Сергей
Сергей
в БД "строка"
Nick
а второе поле mfr_needles?
Сергей
оно всегда одно и тоже (по крайней мере в примерах выше)
Сергей
только mcu_id меняется
Nick
я про значение в документе
Nick
короч выполните свой запрос с одним полем mcu_id в монгошелле
yopp
В WT будет очень небольшой оверхед.
Сергей
короч выполните свой запрос с одним полем mcu_id в монгошелле
и что в нем смотреть? Есть ли тот, что не получаю при конкретном mcu_id?
Oleg
Никакой. Не надо это делать
:( а как же быть тогда? очень больно уже с 500гб на каждом мембере
yopp
Единственный способ переложить эффективно данные — все прочитать и потом записать снова.
Oleg
тоесть накатить новый мембер ?
Oleg
цель - уменьшить количество используемого места под монгу выпилив старые данные
yopp
delete батчами
Сергей
db.getCollection('data').find({'mfr_step': 'mfr_needles', 'mcu_id' : '360033001657345630373420'}).sort({process_time: -1})
Сергей
выдает ответ
yopp
После delete делать ничего не надо, емнип, wt сам отдаст место в хранилище, если сможет.
yopp
Если не сможет, то да, добавить временную реплику и в неё все перелить.
yopp
А потом initial sync по кругу сделать из неё
Nick
выдает ответ
так что за проблема то?
Сергей
видимо в perl - тогда наверное не тут спрашваю :)
Сергей
видимо не явно в число преобразует...
Nick
а если не секрет то что за задачу решаете на перле с монгой?
Сергей
производство оборудования
Сергей
точнее процесс тестирования
yopp
Клево!
yopp
А много данных?
yopp
Вы в монгу только результаты QA пишите? Или прямо протоколы тестирования?
Сергей
я занимаюсь только выводом уже иеющейся инфы :)
Игорь
Такая ситуация. Есть массив значений поля, по которому нужно извлечь документы. Массив большой, несколько десятков тысяч значений. Оператор $in невероятно долго это выполняет, даже с индексом. Как лучше сделать?
Nick
поменять структуру даных
Игорь
?
Nick
вот берете свою основную задачу, и пытаетесь перестроит ьструктуру данных чтобы стало удобно работать и не зависеть от индексов
Игорь
ну тут даже не в индексах дело. есть коллекция. В ней миллион документов. У документа есть поле offer с уникальным значением для каждого документа. Приходит запрос, в нем массив данных с конкретными значеними поля оффер. Допустим 100 000.
Игорь
как это эффективно извлечь
Игорь
$in захлебывается
Игорь
на такой массив
Nick
а вам нужны все 100000 документов?
Игорь
да, все документы у которых поле offer совпадает со значением в массиве. Грубов говоря, у товара есть уникальный id, есть массив с id этих товарав. Их 100 000, в коллекции миллион. Мне нужны только эти 100 000, которые запросили
Nick
ну а дальше что вы делаете с этими 100к доками? сколько из них показываете?
Nick
или
Nick
то выгрузк в экмели всякие всего подряд?
Игорь
Все. Извлекаю, формирую из них файл и отдаю обратно.
Nick
тогда проще выгружать вообще все и фильтровать на клиенте если данных так много
Игорь
То есть у монго нет эффективного средства для подобной выборки? Хотел сделать на стороне базы, в принципе и на клиенте можно, но не хотелось лишний раз такие объемы извлекать туда-сюда
Nick
его нигде нет
Nick
когда выбирается 10% всех данных
Nick
причем скорость получения всех данных ориентировочно будет значительно быстрее если использовать натуральный порядок в БД даже против использования индексов
Игорь
ок, спс
Dmitry
Выгружать миллион и делать на клиенте это тупик все равно. + траффик по сети. Оно минут 20 только выгружаться будет а потом память кончится. Это все равно нужно делать через запрос + paging
Dmitry
возможно можно добавить доп поле и просчитывать его в worker или сразу сохранять и по нему фильтровать
Игорь
В общем $in справился, как ни странно. Нашел в коде утечку памяти из-за которой запрос начинла есть, как не всебя оперативку.
Игорь
плюс добавил по этому же полю еще и $nin
Игорь
работает
Dmitry
какое у вас получилось время ответа севера? (для статистики)
Игорь
тестировал на локальной машине, со скромными ресурсами. По коллекции с 800 000 записями сложный запрос find({$and: [ {$or: [ {'category': {$in: [выбирает все 800 000 значений]}}, {'offer': {$in: [сто тысяч значений]}} ] }, {'offer': {$nin: [сорок тысяч значений]}} ] } ) условие categry $in дополнительно выбирает всю коллецию целиком для усложнения нагрузки. тестирую через скрипт, время ответа базы к скрипту менее секунды. Плюс комп сейчас ОЧЕНЬ скромный по ресурсам, прям совсем
Игорь
ну соотвественно, я не все данные передаю, а только число найденных документов😁
Nick
А что мешает предрасчитать массив для offers а не делать дико сложные ин/нин?