Артём
Жестко)
yopp
но вообще, к вашему фреймворку скорее всего уже что-то есть
yopp
монгоид точно умеет в локализацию
yopp
он использует title.<lang>
Артём
Вот такая штучка подойдет?
https://www.npmjs.com/package/mongoose-intl
Артём
Или есть другие предложения?
yopp
¯\_(ツ)_/¯
yopp
ищите где больше звёздочек и активности
yopp
у меня от js дергается веко, я его терпеть не могу
yopp
вчера я пытался победить вебпак в рельсе, в итоге вебпак победил меня и я сделал по старинке
Артём
Ну вот надо как-то это говницо в vuejs связать)
Артём
Так, по посчитать длину всех всех массивов в документах?
yopp
это совсем совсем плохая идея
yopp
вероятно через агрегацию, $objectToArray и потом $unwind и потом $group
yopp
сложно, медленно, много памяти
yopp
но я не уверен что $ROOT можно размотать, хотя может быть и можно
Артём
Ох ты...
Артём
Ну понятно что тяжелое удовольствие, мне хотя бы раз в час счиать и в redis хранить
yopp
если аттрибуты с массивами известны, то проще
Roman
Возвращаясь ко вчерашнему вопросу.
Запрос:
{ '$expr': { '$gt': [ '$following', $divide: ['$followers', 2] ] },
parsed: true,
taskIds: 5c278ce501d652520a7243c8 }
В результат прилетают документы даже с такими данными:
followers: 80
following: 69
Таким образом запрос не возвращает мне following в два раза больше чем followers, а возвращает странности. В чем дело?
Anonymous
Парни, такой вопрос. Допустим есть коллекция с индексом:
db.coll.createIndex({a: 1, b:1, c:1, d: 1)
Если я буду делать запрос:
db.coll.find({a:1337, c:322, d: 2019})
Индекс будет фильтровать по полям c и d ? Или мне нужно писать так:
db.coll.find({a:1337, b: {$gt: -2147483648}, c:322, d: 2019})
倫太郎
Roman
yopp
Roman
а каких. я же дал :(
Roman
просто Int32 два поля
Roman
у меня ничего не работает меня ругает заказчик и я плачу ;(
yopp
Парни, такой вопрос. Допустим есть коллекция с индексом:
db.coll.createIndex({a: 1, b:1, c:1, d: 1)
Если я буду делать запрос:
db.coll.find({a:1337, c:322, d: 2019})
Индекс будет фильтровать по полям c и d ? Или мне нужно писать так:
db.coll.find({a:1337, b: {$gt: -2147483648}, c:322, d: 2019})
не будет, у вас пропущен один из суфиксов. используя $gt будет получше, но всё равно будет не очень эффективно
yopp
если b опционально, то его лучше поставить в конец индекса
Anonymous
если b опционально, то его лучше поставить в конец индекса
В том и дело, что обычно нужно использовать все поля
db.coll.find({a:1337, b:1073, c:322, d: 2019})
Но иногда нужно делать запрос без поля b:
db.coll.find({a:1337, c:322, d: 2019})
Вот и подумал, что монга достаточно умна, чтобы подобрать индек сама, без написания костыля типа b:any
yopp
если вам нужно делать запрос без поля b, то поставьте его в конец
yopp
композитные индексы проще всего представить как матрешку
yopp
каждый уровень вложен в предыдущий
yopp
если вы пропускаете уровень, то вам надо обходить все вложенные матрешки
yopp
порядок полей в запросе не влияет на использование индекса. влияет состав полей
Roman
вы дайте пример данных
пример данных
following 1000
followers 500
и
following 500
followers 500
первый пример должен попасть в мой запрос, второй нет, то есть только те документы где подписок в 2 раза больше чем подписчиков
yopp
yopp
и отлаживайте тут
Roman
я не использовал aggregate, а использовал только начинку от него?
Roman
и просто ничего не отрабатывало?
yopp
$expr это AF в find
yopp
вы можете отлаживать запросы через aggregate
Roman
понял хорошо спасибо
Anonymous
yopp
под «поставьте в конец» я имел ввиду в индексе
yopp
порядок полей при создании индекса очень важен. лучше пытаться делать порядок «уточнения», когда в каждый следующий уровень попадает меньше документов чем в предыдущий
yopp
например даты, очень часто, имеет смысл ставить первым полем
Anonymous
под «поставьте в конец» я имел ввиду в индексе
Ага, понял. Я вопрос неверно задал. Вернее ситуацию описал.
> лучше пытаться делать порядок «уточнения», когда в каждый следующий уровень попадает меньше документов чем в предыдущий
Я вот как раз об этом
Скажем ситуация такая:
Выборка на поле c огромная. Поэтому добовляется поле b как доп фильтр
db.coll.find({a:1337, b:1073, c:322})
т.е. индекс a:1, c:1, b:1 будет неверный (b должен идти вторым, т.к. он отсекает большую часть лишних записей)
Поэтому нужен индекс a:1, b:1, c:1
Но иногда поле b пустое и приходится делать запрос только по полю c
db.coll.find({a:1337, с:322})
В этом случае какие у меня варианты? Я вижу только:
а) Создать 2 индекса a:1,b:1,c:1 и a:1, c:1,b:1
б) При запросе мокать поле b чтобы заюзался нужнай индекс: db.coll.find({a:1337, b:any, с:322})
yopp
да, правильно видите варианты
yopp
какой размер коллекци?
yopp
есть ещё третий вариант: не делать compound индекса
yopp
сделать 4 отдельных индекса. монга умеет в пересечение
yopp
какой из вариантов выбрать покажет только тестовый стол
Anonymous
какой размер коллекци?
А бог его знает. Пару миллионов записей. А индекс там не из трех полей, а из 5 и поля не маленькие (что делает его огромным и в память не влазит)
> сделать 4 отдельных индекса. монга умеет в пересечение
Вот это интересно. Она сделает 3 запроса по a, b, c и замержит результаты ? Нужно почитать подробнее, не знал о таком
yopp
делаете список целевых запросов, составляете требования по QoS запросов и извлекаете из них список измерямых метрик, пробуете разные варианты, замеряете, сравниваете метрики
yopp
https://docs.mongodb.com/manual/core/index-intersection/
yopp
yopp
но понять какая из стратегий будет эффективнее можно только эксперементально
yopp
ох
yopp
потому что вы неверно себе представляете compound index
yopp
условно, если у вас индекс [a,b,c]
на деле его можно представить как один большой индекс в котором поля смержены последовательно:
a/b/c
yopp
т.е. если у вас есть три документа {a: 1, b: A, c: Z }, {a: 1, b: B, c: B } {a: 1, b: B, c: Z }
то у вас будет три записи
1/A/Z
1/B/B
1/B/Z
yopp
и как вы тут «пропустите» середину? :)
yopp
в индексах нет никакого волшебства, особенно в монге. монга это key/value на стероидах
yopp
представьте что коллекция это key/value, где ключ _id. а индексы это дополнительные key/value где key это индексируемое поле, а постфикс это _id
yopp
и всё что вы можете делать это set/get/scan(range)/delete
yopp
query bound задают scan range
Anonymous
Тут другое, теперь вижу. Если будет {a: 1, b: any, c: 'Z'}, то не важно, индекс {a:1,b:1,c:1} или просто {a:1}. По полям 'b' и 'c' уже фильтровать не будет
yopp
если поля нет в индексе и условие не AND по этому полю с другим из индекса, то запрос и так не может быть выполнен только по индексу
yopp
т.е. индекс {a: 1} не может покрыть поля b и с :)
yopp
если у вас логическое И с полем a, то монга может сначала выбрать по индексу, а потом уже перебирать оставшиеся документы
yopp
any надо ментально заменить на [MinKey, MaxKey] и сразу станет понятно
yopp
у вас запрос останется по индексу, но внутри всех найденных a у вас будет полное сканирование постфиксов
yopp
a b c
1/A/a
1/B/b
2/A/a
2/B/a
2/C/b
3/B/Z
вы знаете что a=2, но не знаете b и знаете что c = a
Nick
yopp
т.е. в этом случае запрос выглядит как a = 2, b = [MinKey, MaxKey], c = a
a =2 оставит нам вот эту часть «дерева»
2/A/a
2/B/a
2/C/b
так как b неизвестно, то монга будет сканировать все эти _ключи_
yopp
не документы
Anonymous
Ага, понял. Спасибо, как всегда помогли тут
Пашол чекать квери... Тэк, где там мой .explain(true) ?)