A
В наличии коллекция справочных данных с 1.6 миллиона записей. В системе есть пользователи, их не миллионы, но тоже достаточно . Каждый пользователь из справочных данных может выбрать несколько "любимых". Надо организовать поиск справочных данных так, чтобы каждый пользователь видел сначала свои "любимые" справочные данные, а потом все остальные.
A
Навскидку есть пара решений, но все они выглядят весьма корявыми
A
Поиск - по текстовому полю + гео-поиск с geoJSON
Petro
Peter Shved: как в mongodb проверить есть ли значение в массиве пример: { _id : 1, list : [{ num: [4,6] }, { num: [3,8] }, { num: [6,1] }] } делал $filter: { input: '$list', as : 'item', cond : { $eq: ['$$item.num', 3] } } не работает -_-
Sergey
Я просто проверял существование нулевого элемента
Sergey
Или речь про вхождение элемента, а не пустой массив?
Sergey
Тогда $in просто
yopp
https://github.com/torodb/torodb
yopp
Интересненько
Sergei
хоть и баян, но в тему
Nick
делаю эксплейн агрегацию по дням: db.docs.explain().aggregate({ $group:{ _id:{ year:"$value.meta.year", month:"$value.meta.month", day:"$value.meta.day" }, totalCount:{$sum:1} } }) причем есть индекс { "value.meta.year" : 1, "value.meta.month" : 1, "value.meta.day" : 1 } однако план не использует индекс: { "stages" : [ { "$cursor" : { "query" : {}, "fields" : { "value.meta.day" : 1, "value.meta.month" : 1, "value.meta.year" : 1, "_id" : 0 }, "queryPlanner" : { "plannerVersion" : 1, "namespace" : "mydb.docs", "indexFilterSet" : false, "parsedQuery" : {}, "winningPlan" : { "stage" : "COLLSCAN", "direction" : "forward" }, "rejectedPlans" : [] } } }, { "$group" : { "_id" : { "year" : "$value.meta.year", "month" : "$value.meta.month", "day" : "$value.meta.day" }, "totalCount" : { "$sum" : { "$const" : 1.0 } } } } ], "ok" : 1.0 }
Nick
почему не используется индекс?
yopp
ещё один
yopp
выстрели в лицо тому, кто предложил тебе такой _id
Nick
какая разница если я по нему агрегировать должен?
yopp
1) у _id лимит на 1024 байта 2) индекс на весь _id работате только для ПОЛНОГО ТОЧНОГО СОВПАДЕНИЯ
yopp
как и для любого индекса по целиком вложенного документа
yopp
такой _id — грубейшая ошибка проектирования
yopp
я ещё уверен что там кроме year/month/date ещё поля есть
Nick
само собой есть, это же документ. _id у доков монговский
Nick
мне же надо агрегацию сделать по данным а не по ключу
yopp
так, кажется я ебусь в глаза
yopp
да, ебусь. окей!
Denis
согласен
yopp
сорян ;)
Nick
там идет зпрос, индекс, эксплейн план. если вдруг непонятно
yopp
я не туда посмотрел
yopp
почему не используется индекс?
а почему он должен использоваться?
Nick
ну типа же есть покрывающий индекс, в котором ест ьвсе данные
yopp
ммм
Nick
уже не в первый раз сталкиваюсь и мне не ясна логика монги как она строит планы
yopp
1) у тебя там вложенный документ. запросы по вложенным документам не могут быть index-only by design
yopp
монге один фиг надо пойти в сторадж и достать весь документ
yopp
(по крайней мере до 3.4 так было, в 3.4 не смотрел ещё, но скорее всего ничего не изменилось)
Nick
т.е. для нормального использования покрывающего индекса в агрегации мне надо вытащить нужные мне поля на самы верхний уровень дока?
Nick
или все еще хуже и только match и sort могут юзать индексы?
yopp
только $match
yopp
afaik sort в AF никак вообще индексы не умеет
yopp
но опять-же, данные немного устаревшие, может уже поправили. они в 3.4 нормально там всего починили
Nick
печаль
yopp
более того, планировщик не все оптимизации может к AF применить
Nick
хотя бы понял в чем дело, дальше уже поищу сам
yopp
в доке всё есть, начни с неё
Dmitry
хоть и баян, но в тему
а что монга так плоха?
Anonymous
а что монга так плоха?
Ты не понял суть.
Dmitry
Ты не понял суть.
не ну я понял что зоопарк непонятно чего
Dmitry
наверное да, таки не понял :)
Mykola 🤷🏼‍♀️
Это нормально, что я не могу за несколько часов локально поднять службу mongod? Сначала один код ошибки - гуглишь, решаешшь. Затем второй - гуглишь, решаешь. И так пару раз, пока круг не замыкается...
Aleksey
Службу? Виндовс чтоли?
Mykola 🤷🏼‍♀️
service. Нет, убунту 16.04
Aleksey
Ставится с пакетов на раз
Alex
ну это же не постгрес, где всё просто и логично =)
Mykola 🤷🏼‍♀️
ну, по мануалам оно так и выглядит, что ставится за раз. Но проверяешь статус - лежит
CC-BY-SA-4.0/Docker-ce30.0
Вангую банальное неумение читать.
Mykola 🤷🏼‍♀️
Не могу инициализировать replica set. Добавил в mongod.conf вот это: replication: replSetName: "001-rs". Сейчас выдает вообще 14 ошибку. А вообще я пытаюсь поднять rocket chat
Mykola 🤷🏼‍♀️
Mykola 🤷🏼‍♀️
рили
CC-BY-SA-4.0/Docker-ce30.0
А разве не пишется что-то кроме кода ошибки? Это же не венда.
Anonymous
Запускаю сам через mongod с параметрами.
Anonymous
У меня все серверы на Debian, так что есть вероятность, что с сервисом из пакетов в Ubuntu тоже что-то не так.
Anonymous
Никогда из репотиториев не вставал нормально.
Sergey
apt-get
Это не ответ на мой вопрос
Anonymous
Это не ответ на мой вопрос
Прости, проглядел.
Anonymous
Репозитории MongoDB всегда подключал.
Sergey
Странно, с ними никогда проблем не замечал. Если только они не ставились поверх стандартных из реп debian/ubuntu, тогда может быть все что угодно.
Sergei
а канал по redis есть?
Alex
где почитать как корректно поднять кластер из трех нод на 2.6 ?
yopp
всё что нужно сделать — обновить до 3.4
Alex
это к сожалению не в моей компетенции
Anonymous
Не повезло.
Pavel
это к сожалению не в моей компетенции
может не в твоих полномочиях? иначе звучит очень самокритично
yopp
в любом случае, вот тебе ссылка: https://docs.mongodb.com/v2.6/tutorial/deploy-replica-set/
yopp
но на 2.6 ты там наешься по мелочи. особенно с wt