Egor
Всем привет! Есть какая-то возможность использовать hint в aggregation pipeline?
Alex
Alex
К каждому документу записывается ещё поле createdAt со значением текущей даты, можно по нему сортировать. Но я пробовал и не получается
Alex
Nick
Нет
Знач проблема в коде, проверяйте что вы делаете с результатом прежде чем вывести/обработать. Зачастую связано с асинхроном
Nick
Nick
Egor
Причем также не заметил особого эффекта, если добавлять hint в $options параметер aggregate от PHP драйвера
Nick
Nick
То что кажется что индекс должен чтото ускорить не означает что действительно ускорит и поэтому могут вполне себе игнорироваться
Egor
Если честно, на глаз по скорости выполнения, которая в случае убития простого индекса и использования compound index драматическим образом увеличивается.
Egor
То есть я выполняю в Compass запрос, он использует простой индекс. Долго. Убиваю простой индекс. Монге ничего не остается, как использовать compound. А вот с ним уже становится весело.
Egor
А если я добавлял hint в $options, то такого прироста не происходило.
Nick
Egor
Да, графический explain в Compass.
Nick
Ну и версию бд
Egor
Долго/быстро - в районе 10 секунд / 0,6 секунды
Egor
версия ... db.version()
6.0.6
Nick
Egor
Если честно, дело было несколько дней назад, я сам запрос не сохранил, он у меня уже в PHP коде. Я за это время уже их мильон написал, и так сходу не найду. Тогда решилось все убитием простого индекса и я это все "стер уже из памяти". Сейчас запрос гораздо проще ($match и $group с $last), и разницы принципиальной в скорости между простым и compound индексом нет. Просто вспомнил ту предудущую историю и спросил, может кто знает как hint'ить можно в Compass'е.
Nick
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
kadet77rus(илья)
yopp
К сожалению я не знаком с реализацией протокола в консуле.
Если у вас есть какие-то подозрения то вы можете снять tcpdump. Сам протокол за исключением логических пакетов это обмен bson, его достаточно легко декодировать. https://www.mongodb.com/docs/manual/reference/mongodb-wire-protocol/#std-label-wire-op-msg
В остальном объём служебного трафика зависит от количества подключений, количества участников кластера, собирается ли телеметрия и других факторов.
kadet77rus(илья)
Ekaterina
Подскажите, на основании чего формируются названия коллекция в монго дб? хочу чтобы данные приходили в chat (он был в ручную создан), но данные приходят в автоматически создаваемую папку test
of Astora 𒉭
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
Nurlan
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
Dev
Типа у каждой машины есть инкремент id
Mashxurbek
Dev
PHP
Accident::query()
->where('cars.80.car_brand', 'BMW 325 I')->get();
Dev
Вот так работает
Dev
Dev
Когда явно указываю айд машины тогда работает
Например
cars.80.car_steering_location : ""
Dev
Dev
Dev
Nick
но обычно это просто говорит о том что чтото делается неправильно, ну или почемуто усложнено
Anonymous
Всем привет!
Подскажите пж, как сделать выборку правильно из массива
Есть документ с массивом:
[
'a',
'b',
'c',
'n'
]
Нужно получить те документы коллекции, в которых есть например
[
'b',
'c'
]
в том же порядке, не важно на каком индексе стоит 1-й элемент
Mashxurbek
Anonymous
Mashxurbek
Mashxurbek
https://www.mongodb.com/docs/manual/reference/operator/query/all/
Anonymous
Mashxurbek
А в чем тогда проблема
Anonymous
Мне нужно получить документы с массивами, где есть встречающиеся элементы в том же порядке и не важно на каком месте они стоят
Anonymous
Anonymous
т.е вернуть документы с массивом
[
'a',
'b',
'c',
'n'
]
При запросе
[
'b',
'c'
]
Не вернуть
[
'с',
'b',
'a',
'n'
]
yopp
Anonymous
Вероятно я не туда думаю при организации бд
Мне нужно получать документы по части текста.
Например есть док
{text: "Привет мир и чат"}
Мне нужно по запросу "мир и чат" получить документ, что выше
Mashxurbek
Mashxurbek
не так ведь?
Mashxurbek
https://www.mongodb.com/docs/manual/text-search/