Nick
Очевидно, что данные идут не в том порядке, в котором они заносились в базу
Сам по себе порядок доков в базе не гарантируется и не зависит от порядка вставки. Порядок значений идшников отсортирован при получении?
Egor
Всем привет! Есть какая-то возможность использовать hint в aggregation pipeline?
Alex
К каждому документу записывается ещё поле createdAt со значением текущей даты, можно по нему сортировать. Но я пробовал и не получается
Nick
Ну так {_id: -1}, оно?
Я спрашиваю в полученных доках ид отсортированы при выводе?
Nick
Нет
Знач проблема в коде, проверяйте что вы делаете с результатом прежде чем вывести/обработать. Зачастую связано с асинхроном
Egor
https://www.mongodb.com/docs/manual/reference/command/aggregate/#hint-an-index
Спасибо! Я это раньше видел, но не понял как этот hint теперь в Compass вставить.
Egor
Причем также не заметил особого эффекта, если добавлять hint в $options параметер aggregate от PHP драйвера
Nick
Причем также не заметил особого эффекта, если добавлять hint в $options параметер aggregate от PHP драйвера
А эффект проверяли через эксплейн и факт наличия индекса в плане выполнения?
Nick
То что кажется что индекс должен чтото ускорить не означает что действительно ускорит и поэтому могут вполне себе игнорироваться
Egor
Если честно, на глаз по скорости выполнения, которая в случае убития простого индекса и использования compound index драматическим образом увеличивается.
Egor
То есть я выполняю в Compass запрос, он использует простой индекс. Долго. Убиваю простой индекс. Монге ничего не остается, как использовать compound. А вот с ним уже становится весело.
Egor
А если я добавлял hint в $options, то такого прироста не происходило.
Egor
Да, графический explain в Compass.
Nick
Да, графический explain в Compass.
Странно, тогда сколько по времени долго и быстро и как выглядит щапрос
Nick
Ну и версию бд
Egor
Долго/быстро - в районе 10 секунд / 0,6 секунды
Egor
версия ... db.version() 6.0.6
Egor
Если честно, дело было несколько дней назад, я сам запрос не сохранил, он у меня уже в PHP коде. Я за это время уже их мильон написал, и так сходу не найду. Тогда решилось все убитием простого индекса и я это все "стер уже из памяти". Сейчас запрос гораздо проще ($match и $group с $last), и разницы принципиальной в скорости между простым и compound индексом нет. Просто вспомнил ту предудущую историю и спросил, может кто знает как hint'ить можно в Compass'е.
Egor
Хорошо! Спасибо за ответы!
Aleksandr
помогите разобраться, у меня есть кластер PSS, на нем сломалась одна S нода, я ее очистил от данных и добавил в реплика сет с priority=0 и SyncFrom= S нода. Нода перешла в состояние STARTUP2 и начала синкать данные. Но вот беда, в этот момент реплика сет перестал принимать операции на запись и естественно все стало плохо, выключил на новой ноде демон mongod, не дало никакого эффекта, только поле аварийного выкидывания из реплика сета через rs.reconfig ситуация стабилизировалась, просто remove не давал сделать. Почему так? и как же мне тогда добавить новую ноду? Вроде же все правильно делаю, может я что то упускаю? не думал что добавление ноды вызовет такой эффект, может это баг?
yopp
помогите разобраться, у меня есть кластер PSS, на нем сломалась одна S нода, я ее очистил от данных и добавил в реплика сет с priority=0 и SyncFrom= S нода. Нода перешла в состояние STARTUP2 и начала синкать данные. Но вот беда, в этот момент реплика сет перестал принимать операции на запись и естественно все стало плохо, выключил на новой ноде демон mongod, не дало никакого эффекта, только поле аварийного выкидывания из реплика сета через rs.reconfig ситуация стабилизировалась, просто remove не давал сделать. Почему так? и как же мне тогда добавить новую ноду? Вроде же все правильно делаю, может я что то упускаю? не думал что добавление ноды вызовет такой эффект, может это баг?
Вероятнее всего дело в priority: 0. При добавлении участника в кластер вручную приоритет устанавливать не нужно. Участник вне состояния secondary и так не может быть выбран как новый primary После установки priority: 0 у одного из трёх участников был потерян кворум, что привело к тому, что в кластере не осталось primary
yopp
https://www.mongodb.com/docs/manual/core/replica-set-priority-0-member/
kadet77rus(илья)
Вечер добрый. Подскажите, межкластерный обмен 30 кбит/с без нагрузки это норма?
yopp
Вечер добрый. Подскажите, межкластерный обмен 30 кбит/с без нагрузки это норма?
Да, участники кластера обмениваются служебной информацией
kadet77rus(илья)
Да, участники кластера обмениваются служебной информацией
У меня сервера консула меньше трафика имеют
yopp
К сожалению я не знаком с реализацией протокола в консуле. Если у вас есть какие-то подозрения то вы можете снять tcpdump. Сам протокол за исключением логических пакетов это обмен bson, его достаточно легко декодировать. https://www.mongodb.com/docs/manual/reference/mongodb-wire-protocol/#std-label-wire-op-msg В остальном объём служебного трафика зависит от количества подключений, количества участников кластера, собирается ли телеметрия и других факторов.
Ekaterina
Подскажите, на основании чего формируются названия коллекция в монго дб? хочу чтобы данные приходили в chat (он был в ручную создан), но данные приходят в автоматически создаваемую папку test
Ekaterina
DB_URL = 'mongodb+srv://eka:*****@cluster0.rzo1owm.mongodb.net/?retryWrites=true&w=majority'
Ekaterina
кароче я добавила имя бд в ссылку и заработало, это верно? DB_URL = 'mongodb+srv://eka:express@cluster0.rzo1owm.mongodb.net/chat?retryWrites=true&w=majority'
....
Всем привет, есть ли ограничение на максимальное создание коллекций ?
....
здравый смысл
Он та и не даёт покоя
Easy Rider
Он та и не даёт покоя
ну а зачем тебе столько коллекций, чтобы задумываться об ограничениях?
yopp
Всем привет, есть ли ограничение на максимальное создание коллекций ?
Прямого ограничения нет, но скорее всего ваша файловая система не позволяет создать бесконечное количество файлов в одной директории. Большое число коллекций это анти-паттерн. Даже в случае с multi-tenant приложениями, более эффективная стратегия это использовать для всех групп пользователей одну коллекцию, в которой есть идентифицирующий ключ. А масштабировать через шардинг и зоны См https://www.mongodb.com/developer/products/mongodb/schema-design-anti-pattern-massive-number-collections/#
Dev
Всем привет, я новичок в mongodb, нужна помощь)) { "_id": { "$oid": "646c9b81ad7c5520ef4053cb" }, "accident_id": "10022", "date": { "$date": "2019-03-14T00:00:00.000Z" }, "cars": { "1102": { "car_brand": "OPEL ASTRA 1.6", "car_steering_location": "left_hand", "car_driver_qualification": "corresponds", }, "1103": { "car_brand": "OPEL ASTRA 1.6 I", "car_steering_location": "left_hand", "car_driver_qualification": "corresponds", } }, "die_count": 1, "injured_count": 1, "die_status": 1, "injured_status": 1,} { "_id": { "$oid": "646c9b81ad7c5520ef4053cc" }, "accident_id": "9974", "date": { "$date": "2019-03-10T00:00:00.000Z" }, "cars": { "1104": { "car_brand": "OPEL ASTRA 1.8 I", "car_steering_location": "left_hand", "car_driver_qualification": "corresponds", "passengers": { "99": { "passenger_person_sex": "", "passenger_injury_degree": "", "passenger_action": "", } } } }, "die_count": 1, "injured_count": 1, "severity_level": "", "die_status": 1,} У меня такая трутура данных, нужно сделать фильтр по cars, когда ищу по конкретному id (cars.1104.car_steering_location= 'left_hand'), четко работает а когда по всей базе то нет (cars.$[].car_steering_location = 'left_hand'), подскажите пожалуйста как сделать правильный SELECT по embedded sub document ?
Mashxurbek
Всем привет, я новичок в mongodb, нужна помощь)) { "_id": { "$oid": "646c9b81ad7c5520ef4053cb" }, "accident_id": "10022", "date": { "$date": "2019-03-14T00:00:00.000Z" }, "cars": { "1102": { "car_brand": "OPEL ASTRA 1.6", "car_steering_location": "left_hand", "car_driver_qualification": "corresponds", }, "1103": { "car_brand": "OPEL ASTRA 1.6 I", "car_steering_location": "left_hand", "car_driver_qualification": "corresponds", } }, "die_count": 1, "injured_count": 1, "die_status": 1, "injured_status": 1,} { "_id": { "$oid": "646c9b81ad7c5520ef4053cc" }, "accident_id": "9974", "date": { "$date": "2019-03-10T00:00:00.000Z" }, "cars": { "1104": { "car_brand": "OPEL ASTRA 1.8 I", "car_steering_location": "left_hand", "car_driver_qualification": "corresponds", "passengers": { "99": { "passenger_person_sex": "", "passenger_injury_degree": "", "passenger_action": "", } } } }, "die_count": 1, "injured_count": 1, "severity_level": "", "die_status": 1,} У меня такая трутура данных, нужно сделать фильтр по cars, когда ищу по конкретному id (cars.1104.car_steering_location= 'left_hand'), четко работает а когда по всей базе то нет (cars.$[].car_steering_location = 'left_hand'), подскажите пожалуйста как сделать правильный SELECT по embedded sub document ?
Можно использовать $expr в find или аггрегацию
Mashxurbek
Всем привет, я новичок в mongodb, нужна помощь)) { "_id": { "$oid": "646c9b81ad7c5520ef4053cb" }, "accident_id": "10022", "date": { "$date": "2019-03-14T00:00:00.000Z" }, "cars": { "1102": { "car_brand": "OPEL ASTRA 1.6", "car_steering_location": "left_hand", "car_driver_qualification": "corresponds", }, "1103": { "car_brand": "OPEL ASTRA 1.6 I", "car_steering_location": "left_hand", "car_driver_qualification": "corresponds", } }, "die_count": 1, "injured_count": 1, "die_status": 1, "injured_status": 1,} { "_id": { "$oid": "646c9b81ad7c5520ef4053cc" }, "accident_id": "9974", "date": { "$date": "2019-03-10T00:00:00.000Z" }, "cars": { "1104": { "car_brand": "OPEL ASTRA 1.8 I", "car_steering_location": "left_hand", "car_driver_qualification": "corresponds", "passengers": { "99": { "passenger_person_sex": "", "passenger_injury_degree": "", "passenger_action": "", } } } }, "die_count": 1, "injured_count": 1, "severity_level": "", "die_status": 1,} У меня такая трутура данных, нужно сделать фильтр по cars, когда ищу по конкретному id (cars.1104.car_steering_location= 'left_hand'), четко работает а когда по всей базе то нет (cars.$[].car_steering_location = 'left_hand'), подскажите пожалуйста как сделать правильный SELECT по embedded sub document ?
можно использовать $elemMatch
Dev
Да я хотел аггрегацию юзать, просто тут есть проблема с лимитом, если респонс больше 16mb ошибку кидает 🤔
Mashxurbek
Всем привет, я новичок в mongodb, нужна помощь)) { "_id": { "$oid": "646c9b81ad7c5520ef4053cb" }, "accident_id": "10022", "date": { "$date": "2019-03-14T00:00:00.000Z" }, "cars": { "1102": { "car_brand": "OPEL ASTRA 1.6", "car_steering_location": "left_hand", "car_driver_qualification": "corresponds", }, "1103": { "car_brand": "OPEL ASTRA 1.6 I", "car_steering_location": "left_hand", "car_driver_qualification": "corresponds", } }, "die_count": 1, "injured_count": 1, "die_status": 1, "injured_status": 1,} { "_id": { "$oid": "646c9b81ad7c5520ef4053cc" }, "accident_id": "9974", "date": { "$date": "2019-03-10T00:00:00.000Z" }, "cars": { "1104": { "car_brand": "OPEL ASTRA 1.8 I", "car_steering_location": "left_hand", "car_driver_qualification": "corresponds", "passengers": { "99": { "passenger_person_sex": "", "passenger_injury_degree": "", "passenger_action": "", } } } }, "die_count": 1, "injured_count": 1, "severity_level": "", "die_status": 1,} У меня такая трутура данных, нужно сделать фильтр по cars, когда ищу по конкретному id (cars.1104.car_steering_location= 'left_hand'), четко работает а когда по всей базе то нет (cars.$[].car_steering_location = 'left_hand'), подскажите пожалуйста как сделать правильный SELECT по embedded sub document ?
если хочешь искать по свойствам embeded документа то можно делать напрямую: collection.find({"cars.car_steering_location": "left_hand"}) в этом случае будет сравнение на свойства под-докмента
Dev
Да я попробовал но не работает, мне кажется ключи мешают {Cars :{ 10: {}, 11: {}, 12:{}} и .т.д
Mashxurbek
Да я хотел аггрегацию юзать, просто тут есть проблема с лимитом, если респонс больше 16mb ошибку кидает 🤔
Если хочешь использовать аггрегацию то в опция аггрегации поставь allowDiskUse
Dev
Типа у каждой машины есть инкремент id
Dev
PHP Accident::query() ->where('cars.80.car_brand', 'BMW 325 I')->get();
Dev
Вот так работает
Dev
Когда явно указываю айд машины тогда работает Например cars.80.car_steering_location : ""
Nick
Да я попробовал но не работает, мне кажется ключи мешают {Cars :{ 10: {}, 11: {}, 12:{}} и .т.д
С такой структурой поможет только $objectToArray. Но это все глупо и надо структуру менять, ни один маломальски сложный поиск вы не выстроите
Nick
Да , я честно говоря не понял почему так сделано, просто база готовая и оч большая, 44мб +
44Мб это в худшем случае несколько сотен тыщ доков - это очень маленькая база. Напишите скрипт на изменение структуры хотя бы на массив а не вот такой суррогатный объект с нумерованными полями. А номер втащите отдельным полем
Nick
@yatoba ещё подскажи пожалуйста, есть вариант добавить лимит аггрегации, по дефолту работает так , если респонс больше 16мб кидает ошибку
нет, 16Мб фундаментальное ограничение в монге на один документ. Стадии агрегирования также порождают потоки доков, так что если результат этапа это один большой док, то мы упираемся как в это ограничение
Nick
но обычно это просто говорит о том что чтото делается неправильно, ну или почемуто усложнено
Anonymous
Всем привет! Подскажите пж, как сделать выборку правильно из массива Есть документ с массивом: [ 'a', 'b', 'c', 'n' ] Нужно получить те документы коллекции, в которых есть например [ 'b', 'c' ] в том же порядке, не важно на каком индексе стоит 1-й элемент
Mashxurbek
https://www.mongodb.com/docs/manual/reference/operator/query/all/
Mashxurbek
А в чем тогда проблема
Anonymous
Мне нужно получить документы с массивами, где есть встречающиеся элементы в том же порядке и не важно на каком месте они стоят
Anonymous
т.е вернуть документы с массивом [ 'a', 'b', 'c', 'n' ] При запросе [ 'b', 'c' ] Не вернуть [ 'с', 'b', 'a', 'n' ]
Anonymous
Вероятно я не туда думаю при организации бд Мне нужно получать документы по части текста. Например есть док {text: "Привет мир и чат"} Мне нужно по запросу "мир и чат" получить документ, что выше
Mashxurbek
не так ведь?
Mashxurbek
https://www.mongodb.com/docs/manual/text-search/