yopp
Тогда займитесь проблемами пользователей
yopp
Я сомневаюсь что пользователей беспокоит отсутсвие break в AF
Joseph
Я сомневаюсь что пользователей беспокоит отсутсвие break в AF
Я думаю да , с большой долей вероятности , что им пофиг 😁
Гена
Коллеги, можете посоветовать статью где можно более понятнее прочитать про блокировки в монге. А то в документации какой-то ад
Paul
В чем преимущество mongo в сравнении с тем же SQL?
Joseph
В чем преимущество mongo в сравнении с тем же SQL?
очень удобный инструменты для работы с ней
yopp
Но в целом никаких приемуществ нет, монга это документное хранилище, а под sql вы скорее всего подразумеваете табличное
yopp
это две разные модели, каждая для своих задач
yopp
а монго это название хранилище
Гена
А в чём вопрос?
Понимание их работы. у нас в шардированном кластере есть пики выпонения запросов на запись от 17 до 30мс причем выглядит так словно они в очереди стоят
Гена
плюс ровно такие же запросы пробегают за 120мс чуть ранее
Serhii
@dd_bb Есть массив обьектов, array: [{ readBy: [] }], нужно включить в агрегейшен результат, если в хоть одном поле readBy нету указанного айдишника, пробовал такой вариант, но он не работает array.readBy: { $not: { $all: [ID] } }
Serhii
@dd_bb можешь пожалуйста подсказать
Гена
а где ее искать?
yopp
сначала в метриках
Гена
какие метрики именно смотреть?
yopp
io
yopp
bw, latency, queue size
Гена
с этим нет проблем utl не превышает 40
yopp
wt cache usage
yopp
read/write queue
yopp
utl это невереная метрика
yopp
только bw ничего не говорит
Гена
что такое bw?
yopp
bandwidth, то что вы называете utilization
yopp
17-30мс это не блокировки
yopp
в шарде блокировки это секунды
Гена
17 -30К мс
yopp
Гена
опечаточка)
Anonymous
В aggregate возможна такая штука? .aggregate([ { $match: { timestamp: { $in: req.body.timestamps } } }, { $group: { _id: null, sum: { $sum: "$price" } } }, { $project: { _id: false, sum: true, timestamp: { $literal: parseInt(req.params.timestamp, 10) } }}, { $limit: parseInt(req.params.limit, 10) } ]) req.body.timestamps это массив.
yopp
опечаточка)
без метрик разговор всё равно бессмысленный
yopp
пока у вас не будет чёткой картины происходящего в кластере, у вас не будет инструментов для анализа
yopp
нет инструментов для анализа, нет возможности формулировать и проверять гипотезы
yopp
начините с деплоя ppm и node exporter
Гена
Хорошо спасибо
Joseph
А есть ли какая то возможность слушать change stream если нет реплики ???
Alexey
начините с деплоя ppm и node exporter
а не расшифруете, что такое ppm?
yopp
или monitoring
yopp
https://www.percona.com/software/database-tools/percona-monitoring-and-management
Alexey
percona perfomance manager
благодарю
Никита
день добрый всем! кто может знает, в базе дата хранится в формате "2019-10-31 12:45:30" как быстрее и производительнее получить все записи за день: { createDate: { '$gt' : '2019-10-31', '$lt' : '2019-11-01' } } или { createDate: { '$regex' : "2019-10-31.*" } }
Никита
сконвертировать в Date
слишком много чего юзает эту коллекцию) ну, если точнее, ~1000 раз юзается сущность)
Dmitriy
слишком много чего юзает эту коллекцию) ну, если точнее, ~1000 раз юзается сущность)
сделайте новое поле с isodate, сконвертируйте дату в него и делайте выборку по нему
Dmitriy
дешевле всего будет
yopp
слишком много чего юзает эту коллекцию) ну, если точнее, ~1000 раз юзается сущность)
проблема в том, что 2019-10 … 2019-01 в тексте придётся делать через очень сложное условие
yopp
да не важно
yopp
вы можете попробовать lt/gt с полной формой записи
Никита
проблема в том, что 2019-10 … 2019-01 в тексте придётся делать через очень сложное условие
в Spring Data MongoDB: mongoTemplate.find(new Query(Criteria.where("createDate").gt("2019-10-31").lt("2019-11-01")); mongoTemplate.find(new Query(Criteria.where("createDate").regex("2019-10-31.*))
Никита
оба варианта работают, просто не знаю, что производительнее
Dmitriy
в Spring Data MongoDB: mongoTemplate.find(new Query(Criteria.where("createDate").gt("2019-10-31").lt("2019-11-01")); mongoTemplate.find(new Query(Criteria.where("createDate").regex("2019-10-31.*))
во втором варианте вы не обеспечиваете between. плюч regex по перформансу будет работать в разы дольше, на него нельзя индекс повесить
yopp
даты :)
yopp
а, в монге же лексиграфическая сортировка ключей
yopp
gt/lt по iso string будет покрывать диапазоны, потому что ключи сортируются 2019-10-31 2019-10-31T12:00 2019-10-31T12:00:01 2019-11-01
yopp
помоему со строками так всегда было
Никита
ну, хоть что-то радует)
yopp
а что вы имеете в виду под «не является ключом»
yopp
это алгоритм сортировки строк, ему в принципе пофиг
yopp
но если у вас по этому полю нет индекса, то это очень зря
yopp
тогд это конечно не самый эффективный способ хранить, но должно работать
yopp
если у вас iso string
yopp
YYYY-MM-DDTHH:MM:SS.ffff
Никита
YYYY-MM-DDTHH:MM:SS.ffff
да, но без T посредине, там просто пробел
Никита
хз почему)
Dmitriy
да, но без T посредине, там просто пробел
это может быть особенность отображения в вашем gui
Josh
@dd_bb Посоветуй как, не используя транзакции, организовать изменение инвентаря пользователя? За источником при этом следить не нужно, смотрю концепцию корзины, но описанный вариант не достаточен. UserSchema userId: Number, ... storage: [ItemSchema] ItemSchema type: String, qty: Number Сейчас делаю так Попытка вставки update( { userId, 'storage.type': { $ne: type } }, { $push: { storage: { type, qty } } }, { new: true } ) При ошибке update( { userId, 'storage.type': type }, { $inc: { 'storage.$.qty': qty } }, { new: true } ) На атласе все. Смотрю в сторону $merge с 4.2 версии, может на воркер посадить все, что пушится.