Михаил
Anonymous
потому что этоо монга
Dmitry
В какой момент будет меняться индекс, когда выполняется update с $inc по полю из этого индекса? При изменении каждого документа или в конце update, когда уже все документы обновлены?
Maxim
Подскажите как обозначается оператор или?
Anonymous
$or
Maxim
спасибо
Viktar
Dmitry
Всем привет, есть небольшая проблема.
Есть коллекция books в которой данные хранятся в некотором виде. У меня задача через lookup получить комментарии и информацию о пользователе, который оставил комvентарий. У меня получилось заменить id на информацию с комментарием и потом id пользователей заменить на их информацию. Но моё решение частично работает т.к. не получается сделать получение информации о пользователе через let и pipeline в lookup. Из-за того, что id может быть в виде строки, по этому и есть необходимость в реализации через let и pipeline.
Результат после первого lookup
"book":{
//Array<String>
_id:...,
comments:[
{
"_id": "609331be9eaf660870f7115c",
"_user": "608b8e66c339f71634642f68",
"text": "Какой-то текст"
},
...
]
}
Частично рабочий вариант:
{ $lookup: {
from: 'users',
localField:'comments._user',
foreignField:'_id',
as: 'comments_user'
}}
Вариант который по идеи должен работать, но не могу понять почему не работает:
{ $lookup: {
from: 'users',
let: {id_temp: "$сomments"}, //"$сomments._user"
pipeline: [
{$match:
{$expr: {
$or:[
{$eq: ["$_id", "$$id_temp"]},
{$eq: ["$_id", { $toString: "$$id_temp" }]}
]}
}}
],
as: 'comments_user'
}}
prrbbttmrrp
привет, как долго устанавливается mongodb?
Dmitry
prrbbttmrrp
уже 40 минут идёт
Андрей
уже 40 минут идёт
Где в представленном процессе установка - стесняюсь спросить?
Null
5.0.3 (Sep 21) • 4.4.9 (Sep 21) ◦ 4.2.16 (Sep 13)
⚠️ Версии 4.4.2-4.4.8 и 5.0.0-5.0.2 содержат критические ошибки в хранилище WiredTiger [1], [2] приводящие к чтению и записи на диск контрольной точки с нарушенной согласованностью данных. Копия данных в памяти остаётся корректной, повреждение происходит при использовании контрольной точки для восстановления данных после аварийного завершения сервера.
Что нового в 5.0 (PDF)
• Решение проблем с MongoDB по подписке
• Документация
• Официальные курсы (Бесплатно)
Stable: 5.0.3 (Sep 21)
Bugfix: 4.4.9 (Sep 21), 4.2.16 (Sep 13)
Legacy: 4.0.27 (Sep 13, ☠️Jan ’22)
По вопросам размещения вакансий, платной поддержки и покупки лицензий пишите @dd_bb
☠️ 3.6.23 (Mar ’21), 3.4.24 (Jan ‘20), 3.2.22 (Dec ’18), 3.0.15 (May ’17)
Leksey
всем привет!
текущая реализация (опустил куски кода с транзакциями):
(все при помощи транзакций)
const dataProduct = await Product.findOneAndUpdate(
{ _id: productId },
{ $inc: { countActivate: 1 } },
{ session, new: true }
);
if (countActivate >= 5000) {
// пользователь не может купить продукт, т.к. его уже купили 5 тысяч раз
// аборт транзакции и завершении сессии
// говорим пользователю что товар раскупили
}
// Если все в порядке, то пользователь купил продукт
await ProductBuy.create(
[
{
userId,
productId
}
],
{ session }
);
// говорим что пользователь успешно купил товар
товары быстро разбирают, максимально быстро
около 200-300 RPS
пользователи встречают writeConflict (здесь все понятно), можно повторить транзакцию N раз
вопрос
как можно увеличить скорость покупки товара?
может есть иные решения?
сейчас при 200-300 RPS около 10 пользователей купят, остальные получат writeConflict
хотелось бы избежать повтора транзакций и ускорить процесс покупки
Leksey
всем привет!
текущая реализация (опустил куски кода с транзакциями):
(все при помощи транзакций)
const dataProduct = await Product.findOneAndUpdate(
{ _id: productId },
{ $inc: { countActivate: 1 } },
{ session, new: true }
);
if (countActivate >= 5000) {
// пользователь не может купить продукт, т.к. его уже купили 5 тысяч раз
// аборт транзакции и завершении сессии
// говорим пользователю что товар раскупили
}
// Если все в порядке, то пользователь купил продукт
await ProductBuy.create(
[
{
userId,
productId
}
],
{ session }
);
// говорим что пользователь успешно купил товар
товары быстро разбирают, максимально быстро
около 200-300 RPS
пользователи встречают writeConflict (здесь все понятно), можно повторить транзакцию N раз
вопрос
как можно увеличить скорость покупки товара?
может есть иные решения?
сейчас при 200-300 RPS около 10 пользователей купят, остальные получат writeConflict
хотелось бы избежать повтора транзакций и ускорить процесс покупки
я искал разные решения
1. менял местами
1) productBuy
2) и далее инкремент количества товара
2. через каунтинг документов
не дает гарантию
Leksey
всем привет!
текущая реализация (опустил куски кода с транзакциями):
(все при помощи транзакций)
const dataProduct = await Product.findOneAndUpdate(
{ _id: productId },
{ $inc: { countActivate: 1 } },
{ session, new: true }
);
if (countActivate >= 5000) {
// пользователь не может купить продукт, т.к. его уже купили 5 тысяч раз
// аборт транзакции и завершении сессии
// говорим пользователю что товар раскупили
}
// Если все в порядке, то пользователь купил продукт
await ProductBuy.create(
[
{
userId,
productId
}
],
{ session }
);
// говорим что пользователь успешно купил товар
товары быстро разбирают, максимально быстро
около 200-300 RPS
пользователи встречают writeConflict (здесь все понятно), можно повторить транзакцию N раз
вопрос
как можно увеличить скорость покупки товара?
может есть иные решения?
сейчас при 200-300 RPS около 10 пользователей купят, остальные получат writeConflict
хотелось бы избежать повтора транзакций и ускорить процесс покупки
есть подозрения, что мне надо будет редис подрубить для каунтинга и проверки 😁
ravia
а есть тут админы которые разворачивали шаред кластер? поделитесь ресурсами где step-by-step расписано толково, а то мне не хватает офф доки
yopp
всем привет!
текущая реализация (опустил куски кода с транзакциями):
(все при помощи транзакций)
const dataProduct = await Product.findOneAndUpdate(
{ _id: productId },
{ $inc: { countActivate: 1 } },
{ session, new: true }
);
if (countActivate >= 5000) {
// пользователь не может купить продукт, т.к. его уже купили 5 тысяч раз
// аборт транзакции и завершении сессии
// говорим пользователю что товар раскупили
}
// Если все в порядке, то пользователь купил продукт
await ProductBuy.create(
[
{
userId,
productId
}
],
{ session }
);
// говорим что пользователь успешно купил товар
товары быстро разбирают, максимально быстро
около 200-300 RPS
пользователи встречают writeConflict (здесь все понятно), можно повторить транзакцию N раз
вопрос
как можно увеличить скорость покупки товара?
может есть иные решения?
сейчас при 200-300 RPS около 10 пользователей купят, остальные получат writeConflict
хотелось бы избежать повтора транзакций и ускорить процесс покупки
да, делать retry это наиболее корректное решение вашей проблемы при таких условиях
yopp
Если вам необходимо соблюдать порядок, чтоб «честно» распределить заказы между пользователями, то в этом случае вам нужна линеаризация заказов на покупку
yopp
т.е. вы делаете бэклог заказов и раз в N секунд этот бэклог в нужном вам порядке обрабатываете
Leksey
yopp
yopp
у вас не получается при такай транзакции больше 300 запросов в секунду?
yopp
т.е. важно разделить проблемы: наличие конфликта и производительность
yopp
а «длительное» это в каком диапазоне?
yopp
на мой взгляд, наиболее продуктивно будет сначала оценить какие задержки возникают при retry
yopp
если сетевые задержки небольшие, то вероятнее всего речь о порядках сотен миллисекунд
yopp
есть ещё второй вариант: вы можете заранее создать пустые заказы по числу доступных позиций товара
yopp
в этом случае ваш запрос будет покрываться еденичным findAndModify
yopp
там тоже возможны конфликты, но монга их попытается сначала разрешить внутренним ретраем
Leksey
yopp
но это имеет смысл только если retry в транзакции имеет какое-то существенное влияение
yopp
на мой взгляд существенным будут цифры в десятки секунд
Leksey
yopp
возможно проблемы и нет 🙂
yopp
Leksey
попробуйте сначала понять насколько сильно retry влияет
т.е. какой показатель нужен?
1 retry - неудача, ушло 10ms
2 retry - неудача, ушло 8ms
...
5 retrry - неудача, ушло 15ms
суммарно ушло: 50ms и пользователь не купил
в данном формате?
правда не понимаю чем мне поможет
что конкретно анализировать и что с этим сделать
Leksey
retry на уровне приложения естественно у мен
yopp
хм. т.е. проблема в том, что из 200-300 запросов в секунду только у 10 получается выполнить заказ?
Пол
Привет всем. Подскажите или скиньте где почитать. Есть многомерный массив с объектами, каким способом лучше сравнить с данными в коллекции и заменить два поля. Заранее блогадарен
Viktar
Можно ли в монге сделать процедуру/функцию
мне нужно сделать каскадное удаление, для многих сервисов, и делать сервис не вижу смысла, а если встраивать функционал в другие сервисы, то получится дублирование кода и сложно поддерживать в случае изменений
Михаил
Ivan
привет. подскажите, пожалуйста, не работает unique: true для String поля phoneNumber в схеме.
все уже перепробовал и перечитал - не помогает. прикол в том, что в другом проекте у меня это идеально работает с String полем email.
я не понимаю, что я мог упустить. реализация идентичная
Viktar
Ivan
useCreateIndex: true
передаю в опции, так что да
Ivan
я специально сейчас передал поле на email. и все работает. с телефоном нет. может ли быть дело в том, что поле email не имеет пробелов, а phoneNumber имеет?
Viktar
Михаил
Мне надо каскадное удаление. которое будут использовать много сервисов
В монге нет каскада в принципе.
И ты же понимаешь, что "мне нужно каскадное удаление" - это абстрактная вещь
Например, у меня есть коллекция А, которая ссылается на коллекцию Б, и есть коллекция В, которая ссылается на коллекцию Г.
И если я удаляю Б, я должен удалять А, а если удаляю Г, то должен удалять В.
И мне для этого придется 2 функции писать в моем коде, которые это удаление производят.
Viktar
Михаил
✙ Nikita
В монге нет каскада в принципе.
И ты же понимаешь, что "мне нужно каскадное удаление" - это абстрактная вещь
Например, у меня есть коллекция А, которая ссылается на коллекцию Б, и есть коллекция В, которая ссылается на коллекцию Г.
И если я удаляю Б, я должен удалять А, а если удаляю Г, то должен удалять В.
И мне для этого придется 2 функции писать в моем коде, которые это удаление производят.
можно ничего не удалять))
и данные сохраняются на случай чего, а если ссылки на них потеряны, можно и не парится)
Михаил
Михаил
Например в контексте персональных данных
Viktar
Я ответил на вопрос)
нет. Вопрос в том что бы сделать процедуру)) если все эти закидывать в код, сложно поддерживать)
✙ Nikita
Михаил
это была неудачная шутеечка)
Ну, я часто такой вопрос встречаю и все говорят что они не удаляют данные
Так что в шутке больше правды, чем шутки)
Ivan
Cloud
Ivan
двадцать раз уже пробовал)
Cloud
так давай по порядку, у тебя в схеме стоит юник тру для телефона
но ты можешь создать записи с одинаковыми телефонами?
Cloud
и индекса для телефона у тебя нет?
точнее он не создается
Ivan
да, все верно. хотя я просто изменил названиеполя с phoneNumber на email и все сработало моментально. я не могу это объяснить
Ivan
ради теста
Cloud
скинь скрин схемы плз
Ivan
const userSchema = new mongoose.Schema(
{
name: {
type: String,
required: true,
},
phoneNumber: {
type: String,
required: true,
unique: true,
},
socialLinks: {
type: [
{
type: String,
},
],
default: [],
},
avatar: {
type: String,
},
},
{ versionKey: false, timestamps: true }
);
Михаил
const userSchema = new mongoose.Schema(
{
name: {
type: String,
required: true,
},
phoneNumber: {
type: String,
required: true,
unique: true,
},
socialLinks: {
type: [
{
type: String,
},
],
default: [],
},
avatar: {
type: String,
},
},
{ versionKey: false, timestamps: true }
);
7 911 9111111
и 7911 9111111 - это два разных номера телефона
Михаил
Номер телефона нужно перед записью в базу стандартизировать
Ivan
я через маску и регулярку на фронте прохожу, по-другому невозможно написать. только так
Максим
это была неудачная шутеечка)
Смотрел как-то доклад один, там мужчина сказал что они вообще ничего не удаляют. Говорит это дорого, дешевле новые диски добавлять.