Artem
я создал индекс на коллекцию
db.getCollection("messages").createIndex({"user_id": 1, "bot_id": 1, "contact_id": 1, "_id": -1 })
шлю запрос
db.messages.find({"user_id:": 7147280, "bot_id": "35f41b59-77cd-409c-a863-04c4ba18a0e7", "contact_id": "f0dc9c82-dc76-42ee-a95e-5c6065988c28"})
получаю что он очень долго весит
yopp
лол
Вы на неделю в read-only в этой группе за хамское отношение к другим участникам
yopp
тут никто никому не помогает!
Это не служба поддержки, а публичная группа, в которой участники добровольно, по мере наличия возможности и времени помогают друг-другу
Если вас это не устраивает, то вы можете оформить подписку db-ai.co и получить ментора
yopp
че ты такой душный?)
Я предупреждаю, если вы будете продолжать подобные дискуссии вы тоже окажетесь в read-only
Гена
Оу...простите(
yopp
Это касается абсолютно всех: я буду нещадно вырезать источники токсичного поведения
Гена
Я наоборот хотел его утихомирить. Ну ок.
yopp
Наиболее эффективно форвадрнуть токсичные сообщения мне в личку
Ilya
пример запроса ?
Ilya
вообще если вам нужен любой документ у которого foo == bar я бы просто такой запрос составил:
{"parentArr.field1.foo": "bar"}
yopp
В таком виде запрос означит полное совпадение значения атрибута parrentArr. Для поиска по одному атрибуту используйте dot notation или $elemMatch
https://docs.mongodb.com/manual/tutorial/query-array-of-documents/#specify-a-query-condition-on-a-field-in-an-array-of-documents
Ilya
@dd_bb а что по песочнице то? заработает?
yopp
на этой неделе попробую добраться
Artem
Artem
Показывал что он не использовал индекс
Artem
и скину
Artem
@ilya_flakin
Вот индекс: https://pastebin.com/4YgcTUQZ
Вот результат explaine: https://pastebin.com/tkZiCtGi
Вот запрос https://pastebin.com/dzn7n36Z на explaine
Второй раз сделал explaine до сих пор висит
Ilya
если честно я не знаю как индексы к аггрегации применяются, тут надо или подождать более знающих или читать доки
Ilya
ну вообще у вас запрос простой - зачем там аггрегация?
Artem
Ilya
все равно странно, я на своей тестовой табличке накидал такой же индекс и при обычном find у меня прекрасно индекс используется
Ilya
сейчас аггрегацию посмотрю
Artem
Я вижу что странно
Artem
https://pastebin.com/JccGf3GC
для запроса
db.messages.find({"user_id:": 7147280, "bot_id": "35f41b59-77cd-409c-a863-04c4ba18a0e7", "contact_id": "f0dc9c82-dc76-42ee-a95e-5c6065988c28"}).explain()
Artem
@ilya_flakin
Вопрос в том что в колекции 150 милионов записей, и индекс весит 3 GB
Ilya
да я вижу что он большой
Artem
Может из за этого не использует индекс при поиске
Artem
но по факту должно
Artem
Может оно гдето там его строит еще
Artem
Но в активных операциях я не вижу
Artem
и новая монга уже background при построение не потдерживает
yopp
А зачем вам _id: -1 в постфиксе индекса?
yopp
В остальном, попробуйте сделать hint на ваш индекс в find
Artem
потому и _id: -1
yopp
Укажите сортировку, причём укажите её в порядке, в котором у вас индекс составлен
yopp
Если вы для сортировки только ключ _id указываете, то это может объяснять почему планировщик выбирает индекс по _id
Гена
Коллеги, подскажите, если у нас бегут запросы и у него фильтр булинг (текст) только текстовый подойдёт индекс?
Гена
не очень пойму как индексировать поля с текстом. Пример - у нас документа и у него есть поле, например, статус заказа - готов.
Запрос ищет по этому "готов". Как вот это поле проидексировать?
yopp
Если запрос на полное совпадение, то обычный индекс
Гена
то есть односоставный ?
Гена
или как? я не пойму
Гена
всё
Гена
разобрался
Гена
спасибо
Araik
Может быть кто-то не спит и сможет помочь, чет не пойму, как в Mongo Atlas сделать запрос на поиск по дате?
Araik
естественно возвращает bad request, как и все остальные попытки))
Welis
Araik '$gte': ISODate(<ДАТА>) ?
Araik
Araik
Araik
Araik
запросы с gte и lte на PHP не хотят работать, через шелл все ок, синтаксис вроде правильный
Araik
Проблема только с датой осталась
Araik
В базе поле имеет тип Date
Araik
Оказалось проблема не с запросом и вообще с монго не связана была, уже все решилось
Araik
Подскажите, условие по дате будет тут работать?
Welis
смотря что внутри $start and $end
Araik
дата, там все ок, обычный find с ними справляется, но текущий запрос с помощью aggregate не дает результата почему-то
Araik
$start = new \MongoDB\BSON\UTCDateTime($this->period['start']);
Araik
Если я правильно понял, то в $match нельзя использовать операторы $qte\$lte ?
Araik
$match does not accept raw aggregation expressions
Araik
Вот блин, а $expr нельзя на Atlas M0 использовать оказывается 🤔
Araik
Araik
Странно, проблема возникает, только когда я добавляю в условие $lte
Araik
Причем формат даты одинаковый и для $gt и для $lt
Araik
если $lte не указывать, то все ок
Ilya
вы их просто в массив добавили
Ilya
добавьте через and
Araik
понять бы еще как 😅 unknown operator: $and in
Araik
Ilya
https://docs.mongodb.com/manual/reference/operator/aggregation/and/
{"created_at": { $and: [ { $gt: [ "$qty", 100 ] }, { $lt: [ "$qty", 250 ] } ] }}
Ilya
не квадратные скобки
Ilya
f
Araik
у меня php
Ilya
а или это в php везде квадратные?
Araik
да, в пхп так