Joseph
yopp
Тогда займитесь проблемами пользователей
yopp
Я сомневаюсь что пользователей беспокоит отсутсвие break в AF
Joseph
Гена
Коллеги, можете посоветовать статью где можно более понятнее прочитать про блокировки в монге. А то в документации какой-то ад
Paul
В чем преимущество mongo в сравнении с тем же SQL?
yopp
yopp
Joseph
yopp
Но в целом никаких приемуществ нет, монга это документное хранилище, а под sql вы скорее всего подразумеваете табличное
yopp
это две разные модели, каждая для своих задач
Paul
yopp
а монго это название хранилище
Гена
А в чём вопрос?
Понимание их работы.
у нас в шардированном кластере есть пики выпонения запросов на запись от 17 до 30мс
причем выглядит так словно они в очереди стоят
Гена
плюс ровно такие же запросы пробегают за 120мс чуть ранее
Serhii
@dd_bb
Есть массив обьектов, array: [{ readBy: [] }], нужно включить в агрегейшен результат, если в хоть одном поле readBy нету указанного айдишника, пробовал такой вариант, но он не работает
array.readBy: {
$not: { $all: [ID] }
}
Serhii
@dd_bb можешь пожалуйста подсказать
yopp
Гена
а где ее искать?
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
yopp
yopp
yopp
или monitoring
yopp
https://www.percona.com/software/database-tools/percona-monitoring-and-management
Alexey
Никита
день добрый всем!
кто может знает, в базе дата хранится в формате "2019-10-31 12:45:30"
как быстрее и производительнее получить все записи за день:
{ createDate: { '$gt' : '2019-10-31', '$lt' : '2019-11-01' } }
или
{ createDate: { '$regex' : "2019-10-31.*" } }
yopp
Никита
сконвертировать в Date
слишком много чего юзает эту коллекцию)
ну, если точнее, ~1000 раз юзается сущность)
Dmitriy
дешевле всего будет
Никита
yopp
да не важно
yopp
вы можете попробовать lt/gt с полной формой записи
Никита
оба варианта работают, просто не знаю, что производительнее
Dmitriy
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
Никита
хз почему)
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 версии, может на воркер посадить все, что пушится.
Dmitriy
@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 версии, может на воркер посадить все, что пушится.
а это не подходит? https://docs.mongodb.com/manual/reference/method/db.collection.findAndModify/ там вроде атомарная операция
Josh