yopp
Второй момент что производительность древовидных индексов не константная и будет O(log n)
Viktar
Я в mongoDB новичок, а сколько индексов должно быть?
Размер в кило, мегабайтах. У вас есть индексы в гигабайт, а есть в 4 килобайта
Viktor
Если есть как-то-то поле которое уникально идентифицирует документ, то по нему сделать уникальный индекс и пропускать duplicate key исключение
Да, есть такое поле. Индекс я могу настроить только подключаясь к монге например через студию или можно из кода ?
Viktor
Используйте bulk операции. Вставлять и апдейтить сразу пачку
Парсинг каждого документа в разных потоках происходит
yopp
Вот сам документ
Возможно вам больше подойдёт Attribute-Value модель для таких данных Те поля по которым вы хотите фильтровать сложите в массив документов attrs: [{a: “t”, v: DateTime}, ...] Сделайте компаунд индекс attrs.a, attrs.v
Viktar
Парсинг каждого документа в разных потоках происходит
Ничего страшного. Это реально написать. У меня на проекте есть самописный многопоточный обработчик на питоне. Думаю и вы сможете, что то похожее найти, написать
Viktor
Спасибо. Пойду гуглить )))
Viktar
Ясно. Стандарт это килобайт или мегабайты
В вашем случае, последние два индекса должны быть не меньше 800 МБ
yopp
Спасибо. Пойду гуглить )))
https://docs.mongodb.com/manual/core/index-unique
Pan
подскажите почему не работает
Pan
Pan
Pan
Pan
подскажите почему не работает
lookup что-то не находит
Дара
Никто с этим не сталкивался? Хочу удалить индексы, но вот такая ошибка выдается, о том что какой то процесс запущен связанный с этой коллекции
Bogdan
Никто с этим не сталкивался? Хочу удалить индексы, но вот такая ошибка выдается, о том что какой то процесс запущен связанный с этой коллекции
Похоже что какой-то запрос выполняется, в то время, как вы пытаетесь удалить индекс, который этот самый запрос и использует
yopp
По этому и такой размер
yopp
Если у вас не 4.4, то придётся подождать
yopp
Потом уже удалить
Pan
подскажите почему не работает
если кому надо будет, то тут localField и foreignField местами поменять надо было
Alexey
Добрый день! Есть такая структура документа: { "_id": { "$oid": "5f19ff0ac695314d3b39a579" }, "workers": { "5f589dc04e2da1d14cb713db": { "is_test": false, }, "5f73196021c61fb9934283c9": { "is_test": true, }, "5f3bcb74abb7654d6aff8753": { "is_test": false, }, }, } нужно в каждый workers добавить новое поле is_test со значением false. Чтоб на выходе стало так: { "_id": { "$oid": "5f19ff0ac695314d3b39a579" }, "workers": { "5f589dc04e2da1d14cb713db": { "is_test": false, "is_blocked": false, }, "5f73196021c61fb9934283c9": { "is_test": true, "is_blocked": false, }, "5f3bcb74abb7654d6aff8753": { "is_test": false, "is_blocked": false, }, }, } перерыл всю доку. Как с массивом вложенных документов понял как сделать. Но тут mapping. по сути это object у которого каждый филд это oid и его значение документ. как бы это в один запрос сделать? ибо этих workers там много.
Kenan
Добрый день! Есть такая структура документа: { "_id": { "$oid": "5f19ff0ac695314d3b39a579" }, "workers": { "5f589dc04e2da1d14cb713db": { "is_test": false, }, "5f73196021c61fb9934283c9": { "is_test": true, }, "5f3bcb74abb7654d6aff8753": { "is_test": false, }, }, } нужно в каждый workers добавить новое поле is_test со значением false. Чтоб на выходе стало так: { "_id": { "$oid": "5f19ff0ac695314d3b39a579" }, "workers": { "5f589dc04e2da1d14cb713db": { "is_test": false, "is_blocked": false, }, "5f73196021c61fb9934283c9": { "is_test": true, "is_blocked": false, }, "5f3bcb74abb7654d6aff8753": { "is_test": false, "is_blocked": false, }, }, } перерыл всю доку. Как с массивом вложенных документов понял как сделать. Но тут mapping. по сути это object у которого каждый филд это oid и его значение документ. как бы это в один запрос сделать? ибо этих workers там много.
думаю стоило бы workers сделать массивом из ObjectID, а вот уже данные состояния вынести в коллекцию юзера, но как я понял - сейчас менять структуру нельзя :)
.
локальная монго, что произойдёт когда достигнет 100 процентов?
Igor
Всем привет, кто может помочь написать два запроса, звучат так: 1) код неисправности «Туго поворачивается пробка крана плиты» и коды заявки c ней, выполненных позднее января 2016 2) количество дней, затраченное на выполнение заявок с номерами меньше 12 Скрипт самой базы могу в лс кинуть
yopp
Добрый день! Есть такая структура документа: { "_id": { "$oid": "5f19ff0ac695314d3b39a579" }, "workers": { "5f589dc04e2da1d14cb713db": { "is_test": false, }, "5f73196021c61fb9934283c9": { "is_test": true, }, "5f3bcb74abb7654d6aff8753": { "is_test": false, }, }, } нужно в каждый workers добавить новое поле is_test со значением false. Чтоб на выходе стало так: { "_id": { "$oid": "5f19ff0ac695314d3b39a579" }, "workers": { "5f589dc04e2da1d14cb713db": { "is_test": false, "is_blocked": false, }, "5f73196021c61fb9934283c9": { "is_test": true, "is_blocked": false, }, "5f3bcb74abb7654d6aff8753": { "is_test": false, "is_blocked": false, }, }, } перерыл всю доку. Как с массивом вложенных документов понял как сделать. Но тут mapping. по сути это object у которого каждый филд это oid и его значение документ. как бы это в один запрос сделать? ибо этих workers там много.
https://docs.mongodb.com/manual/tutorial/update-documents-with-aggregation-pipeline/ + https://docs.mongodb.com/manual/reference/operator/aggregation/objectToArray/ + https://docs.mongodb.com/manual/reference/operator/aggregation/map/ + https://docs.mongodb.com/manual/reference/operator/aggregation/arrayToObject/
Anonymous
Всем привет, не могу добавить в массив вложенный (если не в profile, то все гуд update_one({'user_id': invited}, {'$push': {'profile': {'referals': referal}}})
Дара
Доброе утро всем! Какой оператор используется чтобы конвертировать вот этот документ "_id":"ObjectId(""5f55a43aaa4db6d912489998"")", "TargetRatios":{ "_id":"ObjectId(""5f571e3db956b1285449c4ec"")", "recordType":"NodeMetaData", "NodeId":1006, "WeekBeginOn":"Monday", "EntryZoneIDs":[ 1, 9 ], "ExitZoneIDs":[ 2, 10 ], "TargetRatio":1.75 } в этот: "_id":"ObjectId(""5f571e3db956b1285449c4ec"")", "recordType":"NodeMetaData", "NodeId":1006, "WeekBeginOn":"Monday", "EntryZoneIDs":[ 1, 9 ], "ExitZoneIDs":[ 2, 10 ], "TargetRatio":1.75
Vladimir
Доброго дня. Уже недельку ищу решение проблемы медленного курсора, и чего то не возьму в толк. Есть у меня коллекция на 500к элементов, хочу из нее вытащить 25-40к записей, и отдать их на клиента. Стенд - репликасет (1 master 2 replica) 4.4.2 в докере на одном хосте. Запрос банален testmodel.find({ "resourceType": "virtualMachine" }) Пробовал монгусом, и стандартным mongodb в nodejs разница на уровне погрешности. Результат запроса удручающий, 3-5 секунд. Понимаю, что все тупит, именно из за сетевых задержек, т.к разворачивая в docker-compose на локальной машине точно такой же конфиг время работы = 250ms стабильно. Попробовал tcpdump пить трафик с хостов на себя и смотреть ответы, вижу что ответы летят пачками по 10-12 записей (движения курсора?) Вопрос. Разве это не нормально, хотеть вытащить из базы 25к элементов? Я много хочу? Монга так не работает? У меня явное ощущение, что я чего то в розетку не включил, и оно просто не работает. Пробовал строить индексы по этому полю, реиндексить, и тд. эффекта 0. Пытался крутить batchSize до 100 в нативном клиенте эффекта не заметил (tcpdump показывает все те же 10-12 записей) Крутил коннекшен пул, тоже без результата. Документы мелкие, 5 полей, тестом рандомом наполнил, выглядят вот так. { "_id" : ObjectId("5fe256cff6accd21a13e9155"), "team" : "7LWNfcrf", "resourceName" : "mk5CU5BdmfHtuUA8KRU22CfrMzIkRSJ09yPl", "resourceType" : "virtualMachine", "storeSize" : 3599942, "reportId" : "c510f214-79de-4e12-b725-2af120a50003", "__v" : 0 } Находил пару вопросов по перформансу cursor в интернете, но также без ответов и рекомендаций. https://dba.stackexchange.com/questions/193708/aggregation-vs-cursor-for-reshaping-mongodb-documents https://forums.meteor.com/t/iterating-over-mongo-cursor-too-slow-server-side/19531/10 https://stackoverflow.com/questions/31357025/mongodb-cursor-iteration-performance-issue Офицальные гайды по оптимизации запросов молчат на эту тему. Может кто сталкивался, подскажет куда копать. Или я может чего не так делаю?
Максим
Доброго дня. Уже недельку ищу решение проблемы медленного курсора, и чего то не возьму в толк. Есть у меня коллекция на 500к элементов, хочу из нее вытащить 25-40к записей, и отдать их на клиента. Стенд - репликасет (1 master 2 replica) 4.4.2 в докере на одном хосте. Запрос банален testmodel.find({ "resourceType": "virtualMachine" }) Пробовал монгусом, и стандартным mongodb в nodejs разница на уровне погрешности. Результат запроса удручающий, 3-5 секунд. Понимаю, что все тупит, именно из за сетевых задержек, т.к разворачивая в docker-compose на локальной машине точно такой же конфиг время работы = 250ms стабильно. Попробовал tcpdump пить трафик с хостов на себя и смотреть ответы, вижу что ответы летят пачками по 10-12 записей (движения курсора?) Вопрос. Разве это не нормально, хотеть вытащить из базы 25к элементов? Я много хочу? Монга так не работает? У меня явное ощущение, что я чего то в розетку не включил, и оно просто не работает. Пробовал строить индексы по этому полю, реиндексить, и тд. эффекта 0. Пытался крутить batchSize до 100 в нативном клиенте эффекта не заметил (tcpdump показывает все те же 10-12 записей) Крутил коннекшен пул, тоже без результата. Документы мелкие, 5 полей, тестом рандомом наполнил, выглядят вот так. { "_id" : ObjectId("5fe256cff6accd21a13e9155"), "team" : "7LWNfcrf", "resourceName" : "mk5CU5BdmfHtuUA8KRU22CfrMzIkRSJ09yPl", "resourceType" : "virtualMachine", "storeSize" : 3599942, "reportId" : "c510f214-79de-4e12-b725-2af120a50003", "__v" : 0 } Находил пару вопросов по перформансу cursor в интернете, но также без ответов и рекомендаций. https://dba.stackexchange.com/questions/193708/aggregation-vs-cursor-for-reshaping-mongodb-documents https://forums.meteor.com/t/iterating-over-mongo-cursor-too-slow-server-side/19531/10 https://stackoverflow.com/questions/31357025/mongodb-cursor-iteration-performance-issue Офицальные гайды по оптимизации запросов молчат на эту тему. Может кто сталкивался, подскажет куда копать. Или я может чего не так делаю?
А какой итоговый размер джсона, который вы получаете через 3-5 секунд?
yopp
Доброго дня. Уже недельку ищу решение проблемы медленного курсора, и чего то не возьму в толк. Есть у меня коллекция на 500к элементов, хочу из нее вытащить 25-40к записей, и отдать их на клиента. Стенд - репликасет (1 master 2 replica) 4.4.2 в докере на одном хосте. Запрос банален testmodel.find({ "resourceType": "virtualMachine" }) Пробовал монгусом, и стандартным mongodb в nodejs разница на уровне погрешности. Результат запроса удручающий, 3-5 секунд. Понимаю, что все тупит, именно из за сетевых задержек, т.к разворачивая в docker-compose на локальной машине точно такой же конфиг время работы = 250ms стабильно. Попробовал tcpdump пить трафик с хостов на себя и смотреть ответы, вижу что ответы летят пачками по 10-12 записей (движения курсора?) Вопрос. Разве это не нормально, хотеть вытащить из базы 25к элементов? Я много хочу? Монга так не работает? У меня явное ощущение, что я чего то в розетку не включил, и оно просто не работает. Пробовал строить индексы по этому полю, реиндексить, и тд. эффекта 0. Пытался крутить batchSize до 100 в нативном клиенте эффекта не заметил (tcpdump показывает все те же 10-12 записей) Крутил коннекшен пул, тоже без результата. Документы мелкие, 5 полей, тестом рандомом наполнил, выглядят вот так. { "_id" : ObjectId("5fe256cff6accd21a13e9155"), "team" : "7LWNfcrf", "resourceName" : "mk5CU5BdmfHtuUA8KRU22CfrMzIkRSJ09yPl", "resourceType" : "virtualMachine", "storeSize" : 3599942, "reportId" : "c510f214-79de-4e12-b725-2af120a50003", "__v" : 0 } Находил пару вопросов по перформансу cursor в интернете, но также без ответов и рекомендаций. https://dba.stackexchange.com/questions/193708/aggregation-vs-cursor-for-reshaping-mongodb-documents https://forums.meteor.com/t/iterating-over-mongo-cursor-too-slow-server-side/19531/10 https://stackoverflow.com/questions/31357025/mongodb-cursor-iteration-performance-issue Офицальные гайды по оптимизации запросов молчат на эту тему. Может кто сталкивался, подскажет куда копать. Или я может чего не так делаю?
Покажите пожалуйста explain({executionStats:1}) для вашего запроса
Vladimir
Покажите пожалуйста explain({executionStats:1}) для вашего запроса
Вот executionStats: { executionSuccess: true, nReturned: 25001, executionTimeMillis: 37, totalKeysExamined: 0, totalDocsExamined: 75003, executionStages: { stage: 'COLLSCAN', filter: [Object], nReturned: 25001, executionTimeMillisEstimate: 3, works: 75005, advanced: 25001, needTime: 50003, needYield: 0, saveState: 75, restoreState: 75, isEOF: 1, direction: 'forward', docsExamined: 75003 }, allPlansExecution: [] },
Vladimir
Если я не ошибаюсь то тут nReturned = totalDocsExamined должен быть. если не равно, то означает что индекс построин не правильно или же его вообще нету.
Вот теперь explain executionStats: { executionSuccess: true, nReturned: 25001, executionTimeMillis: 30, totalKeysExamined: 25001, totalDocsExamined: 25001, executionStages: { stage: 'FETCH', nReturned: 25001, executionTimeMillisEstimate: 5, works: 25002, advanced: 25001, needTime: 0, needYield: 0, saveState: 25, restoreState: 25, isEOF: 1, docsExamined: 25001, alreadyHasObj: 0, inputStage: [Object] }, allPlansExecution: [] },
Дара
понял)
Дара
Можете код показать как вы селектите данные?
Vladimir
Да, тут все просто
yopp
У вас точно одинаковые объёмы данных на всех стендах?
Vladimir
У вас точно одинаковые объёмы данных на всех стендах?
Да, сносил на тесте, но как я говорил, это тоже не влияет на запрос. Вот Explain с 500+ к executionStats: { executionSuccess: true, nReturned: 25001, executionTimeMillis: 30, totalKeysExamined: 25001, totalDocsExamined: 25001, executionStages: { stage: 'FETCH', nReturned: 25001, executionTimeMillisEstimate: 3, works: 25002, advanced: 25001, needTime: 0, needYield: 0, saveState: 25, restoreState: 25, isEOF: 1, docsExamined: 25001, alreadyHasObj: 0, inputStage: [Object] }, allPlansExecution: [] },
yopp
Так, хорошо, теперь видно что монга достаёт из хранилища 25 тысяч документов за 30 мс. Это на локальном или на удалённом кластере?
yopp
Вы запускаете скрипт на удалённом сервере или скрипт исполняется локально, но подключается к удалённому серверу?
Vladimir
Вы запускаете скрипт на удалённом сервере или скрипт исполняется локально, но подключается к удалённому серверу?
локально, но подключается к удаленному. Собственно как и работает приложение. Сервер с приложением отдельно, сервер с базой отдельно. Все в рамках одной внутренней сети, никакого хождения через внешние интернеты, никаких облаков.
Vladimir
думал что сеть кривая, пробовал взять на атласе, бесплатную монгу, результаты те же.
yopp
думал что сеть кривая, пробовал взять на атласе, бесплатную монгу, результаты те же.
А попробуйте пожалуйста сделать на вашем сервере дамп с —query, найти в нём .bson файл и после этого скачать этот файл по scp/sftp и замерить время
Vladimir
https://docs.mongodb.com/database-tools/mongodump/#cmdoption-mongodump-query
4.8 мб файл получился. Scp говорит вот что в verbose режиме. Transferred: sent 4484, received 4956336 bytes, in 3.2 seconds Линуксовый тайм тоже самое. real 0m3.699s user 0m0.095s sys 0m0.083s Похоже на то, что 5мб по сети, действительно летает за 3 секунды....
Vladimir
https://docs.mongodb.com/database-tools/mongodump/#cmdoption-mongodump-query
Кстати, монгошелл реагирует на batchSize и действительно, от пачки меняется время, причем, он может за 2.7 протащить, что уже веселее.
yopp
скорее всего ваше сетевое соединение ограничено этой полосой
Vladimir
Все так. [ 3] local 192.168.1.1 port 59762 connected with 10.0.0.88 port 5001 [ ID] Interval Transfer Bandwidth [ 3] 0.0000-10.0468 sec 19.1 MBytes 16.0 Mbits/sec
Vladimir
Подключился к машине с нормальной скорость сети в 2гбит и все равно от пачки зависит очень время выполнения.
Vladimir
А в js коде, по прежнему 3 секунды. Видимо правда, все дело в пачке, надо ток разобраться, как прокинуть ее в драйвер
Denis
А как можно написать запрос типа такого? На ум приходит только такое решение, нужно для нескольких полей сохранять флаги о наличии этого поля, хотел как то сделать одним запросом чтобы избежать гонок db.coll.updateOne({ some: ‘one’ }, { $set: { email: ‘abc’ hasEmail: { // after update, true/false $email: { $ne: null } } } })
Vladimir
Я выставил batchSIze в 80к, и с сетевкой в пару гигабит, это 200ms) Теперь все на своих местах, и работает как положено! Спасибо вам огромное!! @titiaiev @dd_bb @daara9
yopp
Подключился к машине с нормальной скорость сети в 2гбит и все равно от пачки зависит очень время выполнения.
Время выполнения не зависит от размера батча курсора. Когда вы отправляете запрос в базу данных, курсор является интерфейсом к операции, которая обрабатывает этот запрос. В реальности «курсор» это просто идентификатор, который драйвер использует для обмена информацией. Это синхронный request response интерфейс. Скорость выполнения запроса не зависит от курсора, а зависит от стратегии выполнения запроса, которая была выбрана планировщиком. BatchSize регулирует количество документов, которые драйвер получает в ответе когда запрашивает с помощью команды getMore следующую порцию данных с ответом. Единственная экономия которую даёт BatchSize, это экономия на сетевых задержках на передачу команды getMore и ожидания от неё ответа Это обычно имеет эффект при большом числе очень маленьких документов или при больших сетевых задержках.
yopp
Наблюдаемые вами эффекты слабо связаны с тем как работает монга и скорее всего связаны с пропускной способностью сети между узлами
yopp
У большого BatchSize есть обратный эффект. Так как вашему клиенту будет приезжать огромный кусок ответа, который будет необходимо буфферизировать, то вы создадите новое бутылочное горлышко в месте обработки ответа, в первую очередь на уровне драйвера
yopp
Особенно если драйвер для вас сразу десериализует ответ
yopp
Второй момент: бенчмарки по одной точке дают очень очень плохие данные. Для понимания реальной картины, лучше использовать сотни итераций, посчитать min/max/avg/mid/stdev
yopp
Это позволит вам увидеть насколько много шума в измерениях
yopp
Плюс высокий stdev будет говорить о нестабильности условий вашего бенчмарка, что будет ставить под сомнение его результат
Vladimir
Как я понимаю, это баланс сеть или (оперативка + cpu) И раз это дает такой эффект на сеть для меня, то в угоду перформанса, можно покрутить этот баланс в сторону оперативки. Теперь хотя бы понятно куда в случае чего копать, Это обычно имеет эффект при большом числе очень маленьких документов Вот именно это мой случай. Но впредь буду смотреть на сетевое соединение, прежде чем ругать базу)