Alexandrr
там закэшировано 140 гб на сколько я вижу.
я себе в крон забил следующее: sync; echo 1 > /proc/sys/vm/drop_caches sync; echo 2 > /proc/sys/vm/drop_caches sync; echo 3 > /proc/sys/vm/drop_caches каждые 5 секунд fs кэшит мусор в шиндовс тоже самое - fs кэшит при копировании файлов кучу мусора, потом, когда кэш упирается в ограничение оперативы, начинает грузиться диск (за счёт ресурсов диска дальше начинает идти работа)
Alexandrr
У меня флешбеки от этой чистки. 😂
)) есть другой способ? я его не нашёл
(в отпуске) Alexandr
А другого и нет. Главное, что ты про sync не забыл.
Alexandrr
А другого и нет. Главное, что ты про sync не забыл.
честно, понятия не имею, что эта команда значит внутри, как работает и что за механизмы запускает (скорее всего сборщик мусора от OS-и), но получаю нужный результат - сброс кэша файловой системы. а вот в шиндовс всё сложнее, нет консольной команды для cmd, пришлось просить товарища на С написать сборщик мусора
Alexandrr
страшно на проде такое делать)
посоветуйся с девопсятиной, но ничего страшного нет, я делаю и всё ок, у меня 2 тачки с 64гб оперативы, когда монга подобралась к 55% памяти, я заметил тормоза и начал копать, потом увидел, что диск начинает грузиться не из-за работы базы, а из-за "перекладывания оперативы" далее, начал чистить кэш fs и стало работать так же, а монга взяла свой постоянный объём в 65%. так же пытался ограничить монгу такими манипуляциями: storage: wiredTiger: engineConfig: cacheSizeGB: your_gb_int или storage: # Directory for datafiles (defaults to /data/db/) dbPath: ${MONGODB_DATADIR} wiredTiger: engineConfig: configString: cache_size=your_gb_megabytesM но это всё равно не повлияло на мусор от fs, который рано или поздно всё свободное забивает подчистую. потому что дело не в субд тут, а в ОСи
yopp
Да. это плохо? там закэшировано 140 гб top одного из серверов MiB Mem : 257672,8 total, 1601,5 free, 115275,3 used, 140796,0 buff/cach
Нет, не плохо, даже наоборот :) История тут простая: Лимит в 50% системной памяти ограничивает только размер кэша для документов. Монга может запросить больше памяти под другие нужды, например буферы для сортировок, агрегации и тд В кэше документы находятся as is и не сжимаются. Т.е условные 16гб документов занимают 16гб в кэше. На диске данные хранятся уже в сжатом виде. Условные 16гб, будут занимать например 8гб. Когда монга пишет/читает с диска, то ОС использует «свободную» память для кеширования io операций. А значит что в дисковом кэше документы будут храниться уже в сжатом виде. Те самые 8гб. Т.е если увеличить размер памяти который доступен монге под кэш, то уменьшается размер дискового кэша и уменьшается количество закешированных в памяти данных. Плюс дисковый кэш управляется ОС и она может эту память выделять другим процессам.
yopp
Советы трогать кэш — очень плохие
yopp
https://www.mongodb.com/docs/manual/core/wiredtiger/#memory-use
Alexander
Всем привет. Ищем тренера по Mongo для проектной команды бэкендеров со знанием SQL. Отличие NoSQL от SQL, как проектировать схемы в монге, как строить сложные запросы, основы перформанса. Предположительно тренинг на 8-16 часов. Буду благодарен за рекомендацию.
yopp
Метрики по железу в разрезе недели. Еще забыл упомянуть возможно важное, у нас на каждом сервере по два инстанса, сейчас отправлю схему.
У вас не хватает пропускной способности дисковой системы. iostat-x даст чуть больше информации. Самый простой вариант это заменить SATA на приличный NVME. Плюс перейти на zstd или zlib сжатие. У вас много свободного процессорного времени, затраты на компрессию не будут играть роли
Антон
Всем добра! Пытаюсь на коллекции создать индекс на поле и получаю ошибку спустя время: mongos> db.getCollection('collection-test').createIndex({"userId": 1}) uncaught exception: Error: error doing query: failed: network error while attempting to run command 'createIndexes' on host '10.0.10.11:27017' : DB.prototype.runCommand@src/mongo/shell/db.js:169:19 DBCollection.prototype.createIndexes@src/mongo/shell/collection.js:666:16 DBCollection.prototype.createIndex@src/mongo/shell/collection.js:644:12 @(shell):1:1 Как можно повлиять на создание индекса(конфигурацией MongoDB или опциями создания)?
Антон
версия Percona Server for MongoDB server version: v5.0.11-10
Yaroslav
А не желаете взять одного лютого sqlщика и к нему оппонентгм гуру nosql? Так сложится объективная картина. А то это тоже самое когда фронт разраб будет учить других писать бек на ноде
Yaroslav
Разные миры и разные понятия
Yaroslav
У меня есть вопрос, кто-нибудь имел опыт использования монги для финтеха?
Антон
Нет доступа к бд извне, нужно его настроить
индекс появляется, но он не используется при поиске... если бы не было доступа, он наверное бы вовсе не появлялся и ошибка была бы сразу, а не спустя несколько минут.
Yaroslav
кластер
А что с oplog? Может синк разваливается
Yaroslav
Может в реплике уже был создан индекс?
Антон
зачем платить 2м, когда можно 1?)
чтобы потом сэкономить на рефакторинге в 5м, когда приложенька не будет укладываться в SLA
Антон
Может в реплике уже был создан индекс?
индекса не было, а из-за большого числа записей в коллекции могут быть проблемы с созданием индекса? Перезапустил создание индекса, смотрю в логи.
Yaroslav
индекса не было, а из-за большого числа записей в коллекции могут быть проблемы с созданием индекса? Перезапустил создание индекса, смотрю в логи.
Конечно будет проблемы. При создании индекса монга перебирает всю коллекцию и тогда в твоём случае надо бд переводить в maintenance mod и создавать индекс и только потом выключать maintenance mod
Yaroslav
Самый простой вариант, закрыть доступ к бд для всех клиентов извне и в консоли произвести необходимые манипуляции
Anton
воть.. mongostat --port 28500 insert query update delete getmore command dirty used flushes vsize res qrw arw net_in net_out conn set repl time *0 5 *0 *0 1652 516|0 19.0% 75.7% 0 51.0G 43.4G 0|0 1|1 1.12m 1.99m 117 email_5_shard PRI Oct 26 14:03:46.521 *0 4 45 *0 1570 502|0 19.0% 75.7% 0 51.0G 43.4G 0|0 1|1 1.09m 1.91m 117 email_5_shard PRI Oct 26 14:03:47.520 *0 6 1 *0 1604 485|0 19.0% 75.7% 0 51.0G 43.4G 0|0 1|1 1.09m 1.92m 117 email_5_shard PRI Oct 26 14:03:48.519 *0 6 2 *0 1526 368|0 18.9% 75.7% 0 51.0G 43.4G 0|0 1|1 942k 1.77m 117 email_5_shard PRI Oct 26 14:03:49.519 *0 5 3 *0 1488 427|0 18.9% 75.7% 0 51.0G 43.4G 0|0 1|1 991k 1.78m 117 email_5_shard PRI Oct 26 14:03:50.520
Anton
Askhat
Всех приветствую. Нужен совет У меня есть коллекция в котором имеется поле А которое содержит массив из айдишников. Есть эндпоинт который получает массив айдишников B по которым мне нужно найти записи в поле А с помощью $in (A: { $in: B }) и вернуть в ответе найденные записи Есть у кого советы как оптимизировать такой поиск по вхождению? Или это норм, что я монге отдаю большой массив на поиск по вхождению ($in)? Список B потенциально может состоять из 50+ айдишников
Askhat
только индекс создать, 50+ записей не так много, чтобы об этом задумываться
Я о том, что в параметре B который будет приходить с запроса в $in может содержать 50+ значений То есть {A: {$in: [50+ значений]}} для поиска Это ок?
Dmitry
То монга часть документов пропустит
Антон
А что с oplog? Может синк разваливается
Стояли лимиты маленькие на mongod, из-за чего они перезапускались и кластер разваливался. Подкрутил, восстановил ноды из recovery статуса. Индекс создался за 10минут, теперь работает. Спасибо за наводки.
Askhat
Если это будет про индексировано
На скорость запроса никак не влияет, что на поиск приходят жирные параметры для поиска?
Dmitry
Это сильно влияло бы, если не было индекса, а так монга знает где и что искать надо и тем самым это быстро будет
Askhat
Благодарю
Taras Kosyi (ง•̀o•́)ง
Mongoose 5.x Привет. Мне приходит большое колличество документов из бд. Потому хочу обрабатывать их последовательно, используя cursor. Столкнулся с проблемой, что не могу найти рабочий пример в документации. Может кто-то скинуть сниппет, пожалуйста?
Taras Kosyi (ง•̀o•́)ง
После exec вроде есть курсор, но это не точно
С .aggregate().exec()? Сейчас попробую
Dmitry
С .aggregate().exec()? Сейчас попробую
В документации нашёл пример: const cursor = Model.aggregate([{ $match: { age: { $gte: 25 } } }]).cursor(); for await (const doc of cursor) { console.log(doc.name); }
Taras Kosyi (ง•̀o•́)ง
В документации нашёл пример: const cursor = Model.aggregate([{ $match: { age: { $gte: 25 } } }]).cursor(); for await (const doc of cursor) { console.log(doc.name); }
Спасибо! С агрегацией почему-то не сработало (думаю, проблема в версии). А вот Model.find(query).cursor() все гуд
Dmitry
Идёт обращение к mongo
Dmitry
Должно по идеи работать
𝔏𝔢𝔯𝔬𝔶
всем привет, вылазит такая вот ошибка: getBonusesDatatableAggregate Error in getBonusesDatatableAggregate MongoError: Unrecognized expression '$regex' at Connection.<anonymous> (/Users/leroywagner/Desktop/Projects/MacauPokerBackend/public_html/node_modules/mongodb/lib/core/connection/pool.js:453:61) at Connection.emit (node:events:527:28) at processMessage (/Users/leroywagner/Desktop/Projects/MacauPokerBackend/public_html/node_modules/mongodb/lib/core/connection/connection.js:456:10) at TLSSocket.<anonymous> (/Users/leroywagner/Desktop/Projects/MacauPokerBackend/public_html/node_modules/mongodb/lib/core/connection/connection.js:625:15) at TLSSocket.emit (node:events:527:28) at addChunk (node:internal/streams/readable:315:12) at readableAddChunk (node:internal/streams/readable:289:9) at TLSSocket.Readable.push (node:internal/streams/readable:228:10) at TLSWrap.onStreamRead (node:internal/stream_base_commons:190:23) { ok: 0, code: 168, codeName: 'InvalidPipelineOperator', '$clusterTime': { clusterTime: Timestamp { _bsontype: 'Timestamp', low_: 37, high_: 1666882813 }, signature: { hash: [Binary], keyId: [Long] } }, operationTime: Timestamp { _bsontype: 'Timestamp', low_: 37, high_: 1666882813 } } сам код: getBonusesDatatableAggregate: async function(query, length, start, search) { try { return await bonusesModel.aggregate([ { $match: query }, { $lookup: { "from": "user", 'let': {"searchId": {$toObjectId: "$sendedBy"}}, "pipeline": [ { "$match": { "$expr":[ {"_id": "$$searchId"}, ], } }, { "$match": { "$expr": [ {"name": {"$regex": search}} ] } } ], "as": "sender" } }, { $lookup: { "from": "player", 'let': {"searchId": {$toObjectId: "$receivedBy"}}, "pipeline": [ { "$match": { "$expr":[ {"_id": "$$searchId"}, ], } }, { "$match": { "$expr": [ { "$or": [ {"firstname": {"$regex": search}}, {"lastname": {"$regex": search}}, ] } ] } } ], "as": "receiver" } }, { $skip: start }, { $limit: length } ]); } catch (e) { console.log("getBonusesDatatableAggregate Error in getBonusesDatatableAggregate",e); return new Error(e); } },
Nick
всем привет, вылазит такая вот ошибка: getBonusesDatatableAggregate Error in getBonusesDatatableAggregate MongoError: Unrecognized expression '$regex' at Connection.<anonymous> (/Users/leroywagner/Desktop/Projects/MacauPokerBackend/public_html/node_modules/mongodb/lib/core/connection/pool.js:453:61) at Connection.emit (node:events:527:28) at processMessage (/Users/leroywagner/Desktop/Projects/MacauPokerBackend/public_html/node_modules/mongodb/lib/core/connection/connection.js:456:10) at TLSSocket.<anonymous> (/Users/leroywagner/Desktop/Projects/MacauPokerBackend/public_html/node_modules/mongodb/lib/core/connection/connection.js:625:15) at TLSSocket.emit (node:events:527:28) at addChunk (node:internal/streams/readable:315:12) at readableAddChunk (node:internal/streams/readable:289:9) at TLSSocket.Readable.push (node:internal/streams/readable:228:10) at TLSWrap.onStreamRead (node:internal/stream_base_commons:190:23) { ok: 0, code: 168, codeName: 'InvalidPipelineOperator', '$clusterTime': { clusterTime: Timestamp { _bsontype: 'Timestamp', low_: 37, high_: 1666882813 }, signature: { hash: [Binary], keyId: [Long] } }, operationTime: Timestamp { _bsontype: 'Timestamp', low_: 37, high_: 1666882813 } } сам код: getBonusesDatatableAggregate: async function(query, length, start, search) { try { return await bonusesModel.aggregate([ { $match: query }, { $lookup: { "from": "user", 'let': {"searchId": {$toObjectId: "$sendedBy"}}, "pipeline": [ { "$match": { "$expr":[ {"_id": "$$searchId"}, ], } }, { "$match": { "$expr": [ {"name": {"$regex": search}} ] } } ], "as": "sender" } }, { $lookup: { "from": "player", 'let': {"searchId": {$toObjectId: "$receivedBy"}}, "pipeline": [ { "$match": { "$expr":[ {"_id": "$$searchId"}, ], } }, { "$match": { "$expr": [ { "$or": [ {"firstname": {"$regex": search}}, {"lastname": {"$regex": search}}, ] } ] } } ], "as": "receiver" } }, { $skip: start }, { $limit: length } ]); } catch (e) { console.log("getBonusesDatatableAggregate Error in getBonusesDatatableAggregate",e); return new Error(e); } },
$regex неправильно применен он только для файнда, в пгргации надо использовать https://www.mongodb.com/docs/manual/reference/operator/aggregation/regexMatch/
𝔏𝔢𝔯𝔬𝔶
правильно?
Nick
правильно?
нет, посмотрите пример применения в $cond, у вас соответсвенно надо будет в $expr обернуть
𝔏𝔢𝔯𝔬𝔶
типо того?
Nick
ага
Nick
только сомнение что переменная search подставится корректно, этот момент проверьте
𝔏𝔢𝔯𝔬𝔶
всё супер, спасибо)
@Dragos
Привет. Кто нить работает в связке Deno - mongo ?
Exit
Доброго времени суток, не подскажете как вытянуть данные с mongodb/mongoose всё, кроме некоторых
Askhat
всем привет, вылазит такая вот ошибка: getBonusesDatatableAggregate Error in getBonusesDatatableAggregate MongoError: Unrecognized expression '$regex' at Connection.<anonymous> (/Users/leroywagner/Desktop/Projects/MacauPokerBackend/public_html/node_modules/mongodb/lib/core/connection/pool.js:453:61) at Connection.emit (node:events:527:28) at processMessage (/Users/leroywagner/Desktop/Projects/MacauPokerBackend/public_html/node_modules/mongodb/lib/core/connection/connection.js:456:10) at TLSSocket.<anonymous> (/Users/leroywagner/Desktop/Projects/MacauPokerBackend/public_html/node_modules/mongodb/lib/core/connection/connection.js:625:15) at TLSSocket.emit (node:events:527:28) at addChunk (node:internal/streams/readable:315:12) at readableAddChunk (node:internal/streams/readable:289:9) at TLSSocket.Readable.push (node:internal/streams/readable:228:10) at TLSWrap.onStreamRead (node:internal/stream_base_commons:190:23) { ok: 0, code: 168, codeName: 'InvalidPipelineOperator', '$clusterTime': { clusterTime: Timestamp { _bsontype: 'Timestamp', low_: 37, high_: 1666882813 }, signature: { hash: [Binary], keyId: [Long] } }, operationTime: Timestamp { _bsontype: 'Timestamp', low_: 37, high_: 1666882813 } } сам код: getBonusesDatatableAggregate: async function(query, length, start, search) { try { return await bonusesModel.aggregate([ { $match: query }, { $lookup: { "from": "user", 'let': {"searchId": {$toObjectId: "$sendedBy"}}, "pipeline": [ { "$match": { "$expr":[ {"_id": "$$searchId"}, ], } }, { "$match": { "$expr": [ {"name": {"$regex": search}} ] } } ], "as": "sender" } }, { $lookup: { "from": "player", 'let': {"searchId": {$toObjectId: "$receivedBy"}}, "pipeline": [ { "$match": { "$expr":[ {"_id": "$$searchId"}, ], } }, { "$match": { "$expr": [ { "$or": [ {"firstname": {"$regex": search}}, {"lastname": {"$regex": search}}, ] } ] } } ], "as": "receiver" } }, { $skip: start }, { $limit: length } ]); } catch (e) { console.log("getBonusesDatatableAggregate Error in getBonusesDatatableAggregate",e); return new Error(e); } },
{ $match: { $or: [ { firstName: { $regex: search, $options: "i" }}, ... ] } }
Askhat
А в $expr нужно использовать $regexMatch, если требуется взаимодействие с входящими в lookup(или не обязательно lookup) let переменными
Askhat
В вашем случае переменная не из блока let, поэтому используйте стандартный формат
Askhat
всем привет, вылазит такая вот ошибка: getBonusesDatatableAggregate Error in getBonusesDatatableAggregate MongoError: Unrecognized expression '$regex' at Connection.<anonymous> (/Users/leroywagner/Desktop/Projects/MacauPokerBackend/public_html/node_modules/mongodb/lib/core/connection/pool.js:453:61) at Connection.emit (node:events:527:28) at processMessage (/Users/leroywagner/Desktop/Projects/MacauPokerBackend/public_html/node_modules/mongodb/lib/core/connection/connection.js:456:10) at TLSSocket.<anonymous> (/Users/leroywagner/Desktop/Projects/MacauPokerBackend/public_html/node_modules/mongodb/lib/core/connection/connection.js:625:15) at TLSSocket.emit (node:events:527:28) at addChunk (node:internal/streams/readable:315:12) at readableAddChunk (node:internal/streams/readable:289:9) at TLSSocket.Readable.push (node:internal/streams/readable:228:10) at TLSWrap.onStreamRead (node:internal/stream_base_commons:190:23) { ok: 0, code: 168, codeName: 'InvalidPipelineOperator', '$clusterTime': { clusterTime: Timestamp { _bsontype: 'Timestamp', low_: 37, high_: 1666882813 }, signature: { hash: [Binary], keyId: [Long] } }, operationTime: Timestamp { _bsontype: 'Timestamp', low_: 37, high_: 1666882813 } } сам код: getBonusesDatatableAggregate: async function(query, length, start, search) { try { return await bonusesModel.aggregate([ { $match: query }, { $lookup: { "from": "user", 'let': {"searchId": {$toObjectId: "$sendedBy"}}, "pipeline": [ { "$match": { "$expr":[ {"_id": "$$searchId"}, ], } }, { "$match": { "$expr": [ {"name": {"$regex": search}} ] } } ], "as": "sender" } }, { $lookup: { "from": "player", 'let': {"searchId": {$toObjectId: "$receivedBy"}}, "pipeline": [ { "$match": { "$expr":[ {"_id": "$$searchId"}, ], } }, { "$match": { "$expr": [ { "$or": [ {"firstname": {"$regex": search}}, {"lastname": {"$regex": search}}, ] } ] } } ], "as": "receiver" } }, { $skip: start }, { $limit: length } ]); } catch (e) { console.log("getBonusesDatatableAggregate Error in getBonusesDatatableAggregate",e); return new Error(e); } },
Так же на всякий случай дополню. Если вдруг ваши свойства receivedBy и sendedBy изначально типа ObjectId в модели bonusesModel, то кастовать их в ObjectId в блоке let для лукапа не нужно так как это лишняя операция
Exit
find(тут пиши условия)
Это ясно, мне нужен ответ как писать условия фильтра
Dmitry
Dmitry
.find({a: '123', b: true, 'c.d': 'abc"})
Dmitry
Не вижу проблемы
Aha
Всем привет. А почему выдает ошибку? Я винду переустановил и теперь не подключается монго
Aha
а как его запустить(
Maxmudjon
а как его запустить(
win + r services.msc найти MongoDB Server (MongoDB) и кликнов на него стартанут
Aha
А если его там нет)
Aha
может мне помимо монго компаса еще надо чето скачать ?
Dmitry
Надо саму бд ещё установить
Mike
такой вопрос: .dropCollection почему не удаляет полностью коллекцию? + сохраняет какой то кеш(такое ощущение) от прошлой реалищации текущей коллекции,.