Andrey
например, ошибочно было принято решение - что у хоста mid.gov.ru - tld - ru, a домен mid.gov, тогда когда несколько правильней будет что tld gov.ru, а домен mid. В поле tld - старых записях ru, в новых gov.ru.
Andrey
можно писать по новому в "новую" коллекцию конечно. Но при определенных запросах, данных вычитываем в код, от "старой" коллекци - много будет, по новому записей - быстрее.
Dmitry
Dmitry
Andrey
бысрее чем ручнйо экспорт.
Экспорт будет дней 5. Нагрузки на базу - просто чтение, сбой в чтении - так как чанками по 10млн - не критичен, можно с конкретно позиции продолжить. База остается рабочей и доступной для api. А налету update - опасно, мне кажется.
Andrey
вопрос в том, на сколько производительно и корректно работает skip записей из монги
Dmitry
Dmitry
yopp
я не понимаю, и не знаю, как контролировать процесс апдейта полей на таких объемах. Для каждой записи надо ее вычитать, изменить, проапдейтить, плюс будет скорее всего "перерасчет" индекса, значение поля ведь изменится
Контролировать невозможно, всё верно.
Как не крутите, у вас всё равно выйдет 1x чтения и 1x записи.
С точки зрения нагрузки абсолютно без разницы как вы будете это делать, работы плюс-минус эквивалентное количество.
Дешевле всего: lazy update. Но если у вас ошибки в данных, наверное вас это не подойдёт.
Второй вариант это: batched update. Проще всего это сделать по _id, если он остался как ObjectId. В этом случае вам не нужен дорогой skip. Вы выбираете первые N документов, записываете сам младший _id. Обновляете батч. Следующую выборку делаете по условию lt: <last_id>, limit: N. Повторяете пока не закончатся данные.
N подбирается экспериментально, так чтоб найти размер который не создаёт избыточной нагрузки и не разбивает кэш.
Ну и как предложили, тоже самое но в новую коллекцию. Без batched read это чревато тем-же разбиванием кэша, так как страницы с диска всё равно будут читателя сначала в кэш. А значит есть шанс что «горячий» набор данных будет вытеснен и производительность упадёт
yopp
Контролировать невозможно, всё верно.
Как не крутите, у вас всё равно выйдет 1x чтения и 1x записи.
С точки зрения нагрузки абсолютно без разницы как вы будете это делать, работы плюс-минус эквивалентное количество.
Дешевле всего: lazy update. Но если у вас ошибки в данных, наверное вас это не подойдёт.
Второй вариант это: batched update. Проще всего это сделать по _id, если он остался как ObjectId. В этом случае вам не нужен дорогой skip. Вы выбираете первые N документов, записываете сам младший _id. Обновляете батч. Следующую выборку делаете по условию lt: <last_id>, limit: N. Повторяете пока не закончатся данные.
N подбирается экспериментально, так чтоб найти размер который не создаёт избыточной нагрузки и не разбивает кэш.
Ну и как предложили, тоже самое но в новую коллекцию. Без batched read это чревато тем-же разбиванием кэша, так как страницы с диска всё равно будут читателя сначала в кэш. А значит есть шанс что «горячий» набор данных будет вытеснен и производительность упадёт
*первые N используя сортировку соответствующую направлению сортировки индекса. ЕМНИП, у _id это +1
Andrey
Контролировать невозможно, всё верно.
Как не крутите, у вас всё равно выйдет 1x чтения и 1x записи.
С точки зрения нагрузки абсолютно без разницы как вы будете это делать, работы плюс-минус эквивалентное количество.
Дешевле всего: lazy update. Но если у вас ошибки в данных, наверное вас это не подойдёт.
Второй вариант это: batched update. Проще всего это сделать по _id, если он остался как ObjectId. В этом случае вам не нужен дорогой skip. Вы выбираете первые N документов, записываете сам младший _id. Обновляете батч. Следующую выборку делаете по условию lt: <last_id>, limit: N. Повторяете пока не закончатся данные.
N подбирается экспериментально, так чтоб найти размер который не создаёт избыточной нагрузки и не разбивает кэш.
Ну и как предложили, тоже самое но в новую коллекцию. Без batched read это чревато тем-же разбиванием кэша, так как страницы с диска всё равно будут читателя сначала в кэш. А значит есть шанс что «горячий» набор данных будет вытеснен и производительность упадёт
спасибо, но _id - для экономии места, выбран составной и специфический.
yopp
Во-первых, вы это уже не исправите без перезаписи данных в другую коллекцию
yopp
Во-вторых, это минное поле для запросов отличающихся от $eq. Причём даже с $eq можно получить множество проблем, так как неверный порядок ключей и запрос будет мимо индекса
yopp
А неверный порядок получить _очень_ легко. Ну и экономия практически нулевая
yopp
Основная причина: это не составной индекс. Вы индексируете значение в BSON
yopp
yopp
А если по 100, то вы скорее всего выбрали неэффективную схему
Andrey
эта вся история с merge документов, то есть уникальные пары, значения из 2 полей, то такие записи - должны не меняться, а только добавляться значение в одно из полей...но в монго-тулс - вставка таких документов идет через go код:
updateDoc := bson.D{{"$set", document}}
result, err = inserter.Update(selector, updateDoc)
И поэтому например, поле 'days' - через mongoimport - Затиралось
а надо через код(Python)
update_doc = {'$addToSet': {'days': {'$each': events}},
'$set': record}
operation = UpdateOne({'_id': _id}, update_dict, upsert=True)
На том этапе - надо было грузить много данных, поленился поменяться код в mongo-tools....в итоге структура документов - по факту не известна
yopp
эта вся история с merge документов, то есть уникальные пары, значения из 2 полей, то такие записи - должны не меняться, а только добавляться значение в одно из полей...но в монго-тулс - вставка таких документов идет через go код:
updateDoc := bson.D{{"$set", document}}
result, err = inserter.Update(selector, updateDoc)
И поэтому например, поле 'days' - через mongoimport - Затиралось
а надо через код(Python)
update_doc = {'$addToSet': {'days': {'$each': events}},
'$set': record}
operation = UpdateOne({'_id': _id}, update_dict, upsert=True)
На том этапе - надо было грузить много данных, поленился поменяться код в mongo-tools....в итоге структура документов - по факту не известна
Да, динамически ключ это антипаттерн. Перейти на массивы хорошая идея, индексы будет строить проще и вероятно дешевле
yopp
Вот тут составные будут хорошо работает
Andrey
вне темы - конечно поражает, как монга хорошо сжимает данные...просто супер
yopp
Если вы хотите сделать обновление через mongoimport, то это не имеет смысла.
Самый просто вариант: читать из старой коллекции в новую. В принципе, так как _id уникальный индекс, то вероятно трюк с $gt прокатит и на вашем значении.
Andrey
yopp
самый быстрый вариант это или mongorestore, особенно если у вас шард или db.a.find/aggregate -> db.b.bulkInsert
yopp
Плюс агрегации с $merge: экономите на сети
yopp
Правда с вычислением смещения будет сложнее, но это решается разделением на два треда: один вычисляет смещения, второй делает миграции по смещениям
Maksym
Ребята привет. Простой вопрос, я думаю. Реально ли это как-то отформатировать, чтобы оно просто вернуло массив с объектами?
Maksym
const data = await Appointments.aggregate([
{
$match: {
patient: "WR1V5oe9dsWVExq5f0KvGP4eRhe2",
},
},
{
$facet: {
upcoming: [
{
$match: {
"event.start": { $gt: currentDate },
},
},
{
$sort: {
"event.start": 1,
},
},
],
passed: [
{
$match: {
$or: [
{ "event.end": { $lt: currentDate } },
{
"event.start": { $lt: currentDate },
"event.end": { $gt: currentDate },
},
],
},
},
{
$sort: {
"event.start": -1,
},
},
],
},
},
{
$project: {
result: {
$concatArrays: ["$upcoming", "$passed"],
},
},
},
]);
Maksym
А то оно сейчас возвращает массив с объектом, в котором ключ с массивом с объектами. Извините, если код не правильно кинул
Артем
Сегодня зашел в монгу и увидел там базу READ__ME_TO_RECOVER_YOUR_DATA, в которой есть единственный документ, просящий выкуп за удаленные данные. Я в курсе, что это такое, но у меня есть два отличия от типичной ситуации, в которой такая штука появляется. Во первых, мои данные не были удалены, все полностью осталось на месте. Во вторых, база защищена аутентификацией через логин/пароль и войти в нее у меня лично без логина и пароля не получилось. Меня беспокоит, что кто то смог записать в базу документ, хоть и не удалил все данные. У кого то была похожая ситуация? Может есть какой то дефолтный пользователь, через которого можно зайти в базу и увидеть ее не всю, но иметь возможность записи? Есть идеи куда смотреть?
Ilya
Сегодня зашел в монгу и увидел там базу READ__ME_TO_RECOVER_YOUR_DATA, в которой есть единственный документ, просящий выкуп за удаленные данные. Я в курсе, что это такое, но у меня есть два отличия от типичной ситуации, в которой такая штука появляется. Во первых, мои данные не были удалены, все полностью осталось на месте. Во вторых, база защищена аутентификацией через логин/пароль и войти в нее у меня лично без логина и пароля не получилось. Меня беспокоит, что кто то смог записать в базу документ, хоть и не удалил все данные. У кого то была похожая ситуация? Может есть какой то дефолтный пользователь, через которого можно зайти в базу и увидеть ее не всю, но иметь возможность записи? Есть идеи куда смотреть?
у тебя роль админа-то под паролем?
Кракозябр
Доброго. Подскажите, используете ли какие балансировщики для монги? По типу ProxySQL
Ilya
Сегодня зашел в монгу и увидел там базу READ__ME_TO_RECOVER_YOUR_DATA, в которой есть единственный документ, просящий выкуп за удаленные данные. Я в курсе, что это такое, но у меня есть два отличия от типичной ситуации, в которой такая штука появляется. Во первых, мои данные не были удалены, все полностью осталось на месте. Во вторых, база защищена аутентификацией через логин/пароль и войти в нее у меня лично без логина и пароля не получилось. Меня беспокоит, что кто то смог записать в базу документ, хоть и не удалил все данные. У кого то была похожая ситуация? Может есть какой то дефолтный пользователь, через которого можно зайти в базу и увидеть ее не всю, но иметь возможность записи? Есть идеи куда смотреть?
Дефолтный пользователь -- admin, дефолтный пароль -- q1a2s3w4
Ilya
Сегодня зашел в монгу и увидел там базу READ__ME_TO_RECOVER_YOUR_DATA, в которой есть единственный документ, просящий выкуп за удаленные данные. Я в курсе, что это такое, но у меня есть два отличия от типичной ситуации, в которой такая штука появляется. Во первых, мои данные не были удалены, все полностью осталось на месте. Во вторых, база защищена аутентификацией через логин/пароль и войти в нее у меня лично без логина и пароля не получилось. Меня беспокоит, что кто то смог записать в базу документ, хоть и не удалил все данные. У кого то была похожая ситуация? Может есть какой то дефолтный пользователь, через которого можно зайти в базу и увидеть ее не всю, но иметь возможность записи? Есть идеи куда смотреть?
Если серьёзнее -- полные списки пользователей, аудит логинов и действий, нормальные ограничения на вход (в первую очередь -- разрёшэнные IP), анализ протоколов аутэнтификацыи на безопасность (под документацыи) вам придётся делать самому.
Ну и, самое время подумать о верификацыи данных. Регулярной. Например, хотя бы с бэкапами сравнивать исторические данные, вот это всё.
✨ Uni
Сегодня зашел в монгу и увидел там базу READ__ME_TO_RECOVER_YOUR_DATA, в которой есть единственный документ, просящий выкуп за удаленные данные. Я в курсе, что это такое, но у меня есть два отличия от типичной ситуации, в которой такая штука появляется. Во первых, мои данные не были удалены, все полностью осталось на месте. Во вторых, база защищена аутентификацией через логин/пароль и войти в нее у меня лично без логина и пароля не получилось. Меня беспокоит, что кто то смог записать в базу документ, хоть и не удалил все данные. У кого то была похожая ситуация? Может есть какой то дефолтный пользователь, через которого можно зайти в базу и увидеть ее не всю, но иметь возможность записи? Есть идеи куда смотреть?
в монге по дефолту параметр какой-то выключен
✨ Uni
я об этом узнал, когда тоже увидел READ_ME…
BsLk
Привет, Я пишу на python. мне нужно ловить исключение при неверном подключении
BsLk
Библиотека mongoengine
Andrey
Andrey
Сегодня зашел в монгу и увидел там базу READ__ME_TO_RECOVER_YOUR_DATA, в которой есть единственный документ, просящий выкуп за удаленные данные. Я в курсе, что это такое, но у меня есть два отличия от типичной ситуации, в которой такая штука появляется. Во первых, мои данные не были удалены, все полностью осталось на месте. Во вторых, база защищена аутентификацией через логин/пароль и войти в нее у меня лично без логина и пароля не получилось. Меня беспокоит, что кто то смог записать в базу документ, хоть и не удалил все данные. У кого то была похожая ситуация? Может есть какой то дефолтный пользователь, через которого можно зайти в базу и увидеть ее не всю, но иметь возможность записи? Есть идеи куда смотреть?
А что в логах монга пишет?
꧁Anton
Всем привет)
Делаю запрос с аггрегацией. На одном из шагов в пайплайне "фильтрую" документы с помощью match <число> $in в большом [числа] (может быть как 1000 элементов, так и 10к).
Будет ли такой фильтр эффективно отрабатывать?
Александр
Добрый день. Подскажите пожалуйста, как получить количество групп?
Александр
cityAmount: await (await CharacteristicsUsers.aggregate().group({_id: {city: "$city"},})).length
Это работает, но два await меня смущают. Хотел бы понять как правильно
Александр
Kirill
Александр
Kirill
так точно
Вместо await exec и в нем проверяйте length
Kirill
departamentAmount: Sessions.aggregate().group({_id: {departament: "$departament"}}).exec(
function (err, result){
console.log(result.length)
})
$heriF
Всем привет, пытаюсь сделать кластер на монго дб атлас. Пишет, что нужно подождать 1-3 минуты, уже прошло больше 20 минут. Это нормально?
Mr.
Привет всем!
Mr.
У меня один вопрос... я слепой, или тупой?
Вроде всё по арчвики делал...
Mr.
Mr.
А всё... Я нашел ошибку
Mr.
А... Не, показалось
Mr.
Mr.
Pan
у меня есть документ юзера и каждый юзер содержит какойто адресс свой
может даже несколько
стоит ли мне адресса выносить в отдельную коллекцию? или держать их в документе юзера?
Pan
тут обычно думают так: если адресс часто используется в связке с данными юзера: то хранить вместе все
я правильно понимаю?
Вячеслав
Добрый день. У меня есть конфигурация устройств. Эта конфигурация сейчас в реаляционном виде. Сейчас я хочу ее перенести в документ. Т.е одна конфигурация = один документ. Но у меня получается что документ может превышать 16 мб. Вопрос, может есть какая-то статья (в интернете не нашел так сразу), где рассказывается как дробить документ? Может мне надо, чтобы у меня одна конфигурация должна быть равна одной коллекции? Можно ли работать с GridFs, на сколько это быстро? И может уже можно увеличить просто размер документа больше чем 16 мб?
Viktar
Viktar
Связать можно. Но это не так быстро как в реляционке, если большие объемы. Посмотрите aggregate lookup
https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/
Вячеслав
Viktar
Док не сильно мне понятен.
Dmitry