Alexandrr
отдельный тред удаляет данные, если память не изменяет, то раз в минуту. он выбирает документы у которых значение поля по которому построен TTL индекс, равно или больше текущего времени + значения expireAfterSeconds.
Если сделать дамп, а потом его загрузить обратно, то если дата + expireAfterSeconds будет в прошлом, то тред начнёт удалять документы
спасибо, это и нужно было узнать, а то в доке написано, что тред, но не понятна его логика работы при восстановлении из дампа, получается, она не меняется и идёт такое же сравнение.
а где прочесть про "1 минуту"?
а то для меня 1 минута критична...
Dmitry
yopp
yopp
в документации нет упоминания ttlMonitorSleepSecs, но его можно настроить через serverParams
Alexandrr
Alexandrr
yopp
если не ошибаюсь, то планировщик может использовать ttl индекс. можно проверить через explain. затраты не очень большие должны быть
yopp
а о каких объёмах документов речь?
yopp
а какой процент под ttl попадает?
Alexandrr
а какой процент под ttl попадает?
ну вообщем попробую по совету, спасибо, на счёт explain-а, если сильно скажется на производительности, то буду "сборщик мусора" свой писать
yopp
а какая точность по времени нужна?
Alexandrr
Alexandrr
я вот думаю, мож редиску для этой задачи использовать, но похоже там такой же механизм с задержками 0-60
Котик
Как иначе форматировать? не понимаю
Мне в БД нужно писать строковые параметры
пробовал писать даже не форматированные параметры, не понимаю в чем проблема
ᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠ
Котик
это работает и в случае с SQL подобными БД
ᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠ
MongoDB не реляционная БД, где информация хранится в JSON формате. О каких таблицах идет речь?
Alexandrr
Andrey
всем привет! подскажите пожалуйста как можно ускорить запрос, коллекция примерно 100млн документов. через MongoDB Compass (Explain Plan) такой запрос обрабатывается почти 2 минуты.
db.messages.aggregate([
{ "$lookup": { "from": "leads", "localField": "lead", "foreignField": "_id", "as": "leadInfo" } },
{ "$unwind": "$leadInfo" },
{ "$match": { "$and": [
{ "leadInfo.ownerId": { "$exists": false } },
{ "smsStatus": { "$ne": "error" } },
{ "sentAt": { "$gte": new Date("2022-09-30T22:00:00") } },
{ "sentAt": { "$lte": new Date("2022-10-31T22:59:59") } }
] } },
{ "$group": { "_id": { "identifier": "$sourceId", "status": "$smsStatus" }, "count": { "$sum": 1 }, "costs": { "$sum": "$cost" } } }
])
Vladyslav
всем привет! подскажите пожалуйста как можно ускорить запрос, коллекция примерно 100млн документов. через MongoDB Compass (Explain Plan) такой запрос обрабатывается почти 2 минуты.
db.messages.aggregate([
{ "$lookup": { "from": "leads", "localField": "lead", "foreignField": "_id", "as": "leadInfo" } },
{ "$unwind": "$leadInfo" },
{ "$match": { "$and": [
{ "leadInfo.ownerId": { "$exists": false } },
{ "smsStatus": { "$ne": "error" } },
{ "sentAt": { "$gte": new Date("2022-09-30T22:00:00") } },
{ "sentAt": { "$lte": new Date("2022-10-31T22:59:59") } }
] } },
{ "$group": { "_id": { "identifier": "$sourceId", "status": "$smsStatus" }, "count": { "$sum": 1 }, "costs": { "$sum": "$cost" } } }
])
какой индекс используется?
и с explain предоставьте "nReturned", "totalDocsExamined" и "executionTimeMillis". (для уверености лучше 2: один без группировки и 2 с ней)
Andrey
Andrey
индекс я неправильно настроил скорее всего, потому что он не используется..
Andrey
Andrey
Vladyslav
вы ж писали про 2 минуты, а тут по 40 сек на скринах
Andrey
да, я вчера вечером делал, сервер был в нагрузке, сегодня заново
Vladyslav
в любом случае, настройте индекс и уже будет лучше)
Alexandrr
смотрю разница в группировке/без всего лишь на 200 документов, может она не нужна?
Andrey
Andrey
Vladyslav
Wassilevs
по отдельности индексы, нет смысла, планер использует только один, нужен составной по правилу ESR
Wassilevs
@BEL0V
можете попробовать такой
db.messages.createIndex({"leadInfo.ownerId":1,"smsStatus":1,"sentAt":-1})
Andrey
Andrey
Andrey
Wassilevs
@BEL0V я тупанул, по explain видно что первый этап идёт на smsStatus, потом sentAt
так что лучше попробовать сначала по этим полям
db.messages.createIndex({"smsStatus":1,"sentAt":1})
Andrey
Ivan
Привет. Такая ситуация поднял кластер на 3 инстанса, нов компасе видны только два. Подскажите как правильно загуглить проблему ?
Wassilevs
какой статус реплики?
rs.status()
Nick
Ivan
то есть переустановить монгу, самый быстрый способ ?
Кылыч
ку! господа, помогите плиз найти решение. условно есть одна коллекция, где содержатся список товаров, и есть у нас другая коллекция(грубо говоря в одной записи айдишник юзера + массив айдишек популярных товаров), задача следующая, при фильтрации каждому юзеру нужно сперва показать именно те которые считаются рекомендоваными, а потом только обычные товары. как лучше всего это сделать? так как список популярных товаров для каждого юзера примерно 200 шт, и не хочется похерить монгу используя оператор $in по айдишкам. тут еще один момент, список юзеров с массивом популярных для них товаров содержится в произвольном виде, то есть эти данные можно хранить в любом формате, главное чтобы выплывание наверх этих товаров работало. подскажите плиз варианты решения?) заранее благодарю!)
Nick
да, потмоу что 3.6 версия давно не поддерживается и там вполне может быть несовместимость с компасом
Alexandrr
такие вещи огромные скидывайте на пастебин лучше
Ivan
спасибо за совет
Кылыч
ку! господа, помогите плиз найти решение. условно есть одна коллекция, где содержатся список товаров, и есть у нас другая коллекция(грубо говоря в одной записи айдишник юзера + массив айдишек популярных товаров), задача следующая, при фильтрации каждому юзеру нужно сперва показать именно те которые считаются рекомендоваными, а потом только обычные товары. как лучше всего это сделать? так как список популярных товаров для каждого юзера примерно 200 шт, и не хочется похерить монгу используя оператор $in по айдишкам. тут еще один момент, список юзеров с массивом популярных для них товаров содержится в произвольном виде, то есть эти данные можно хранить в любом формате, главное чтобы выплывание наверх этих товаров работало. подскажите плиз варианты решения?) заранее благодарю!)
Дополню, есть пагинация, и если скажем список рекомендованных товаров не заполнили одну страницу, то тогда нужно допинать уже из дефолтной выборки и так далее
Wassilevs
Alexandrr
Murena
все привет - подскажите, как изменять индекс документа в массиве субдокументов, знаю что есть оператор position - но он только работает с push , есть ли еще какой то способ просто изменять очередность елементов в массиве монги (без добавление вспомагательных полей типа order для сортировки)
Nick
spectrum
Подскажите пожалуйста, если файлы уже загружены на сервер (Express) и я хочу записать их в MongoDB используя Mongoose, можно ли обойтись без Multer/Multer-gridfs-storage пакетов? Можно ли как то используя только Mongoose и GridFS загрузить файлы с сервера в MongoDB? Заранее благодарю за помощь.
fierylife
Can't find a codec for class java.lang.Object аааааааааааааааааааа
fierylife
что за дичь))
Тимур
ребят, подскажите пж, как отфильтровать коллекцию по длине строки?
Ivan
Добрый день. Нужен ваш совет. В рамках mongodb транзакции стоит использовать, если обновляешь две и более коллекции или как-то иначе ?
ASAP
ASAP
Ребята, всем привет, подскажите, как правильнее было бы решить задачу:
имеется струткура (скрин), нужно при каждом новом добавлении новой модели
проверять, есть ли выделенные значения со скрина (значения полей mail/phone, эти ключи могут меняться,
они приходят по-разному с фронта: mail, email, e-mail...)в других моделях.
Если да, то считать количество таких дубликатов, запоминать, где конкретно они встретились (наверное по _id)
и при этом, если оба значения в этих полях совпадают, то это "полный дубликат", если хотя бы одно, то "частичный".
Нужно отдать два значения на фронт и если пользователь решает удалить какие-то из дубликатов, мы эти поля удаляем из ДБ.
Проблема в том, что нужно делать это для каждого элемента. То есть, к примеру создалась новая модель, где есть file:[{mail:'exmaple'}
,{email: 'examplemail},{mail:'xxx},{}] и мне нужно брать каждый объект и сравнивать с каэжым объектом из уже имеющихся. Есть ли какое-то решение
с методом, наподобие нативного filter в js? Могу еще дополнительно скинуть пример кода, как я реализовал это на фронте.
Но там я проверяю только в рамках одной будущей коллекции на этапе ее формирования еще.
//Находим последнее вхождение в нашу коллекцию
app.models.ParsedList.find({},
(_, data) => {
let ID = data[data.length - 1].id
app.models.ParsedList.find({'_id': ID},
(_, data) => {
console.log(data)
})
})
//Обновляем или удаляем наше значение
app.models.ParsedList.findOneAndUpdate(
{_id: '636b7e1d2a6e60a01f4aa6e2', 'file.mail': 'test' },
{
$set: {
'file.$.mail': 'test'
}
// , $unset: { 'file.$.phone': '1' }
},
{new: true},
(_, data) => {
console.log(data)
}
)
Nick
Ребята, всем привет, подскажите, как правильнее было бы решить задачу:
имеется струткура (скрин), нужно при каждом новом добавлении новой модели
проверять, есть ли выделенные значения со скрина (значения полей mail/phone, эти ключи могут меняться,
они приходят по-разному с фронта: mail, email, e-mail...)в других моделях.
Если да, то считать количество таких дубликатов, запоминать, где конкретно они встретились (наверное по _id)
и при этом, если оба значения в этих полях совпадают, то это "полный дубликат", если хотя бы одно, то "частичный".
Нужно отдать два значения на фронт и если пользователь решает удалить какие-то из дубликатов, мы эти поля удаляем из ДБ.
Проблема в том, что нужно делать это для каждого элемента. То есть, к примеру создалась новая модель, где есть file:[{mail:'exmaple'}
,{email: 'examplemail},{mail:'xxx},{}] и мне нужно брать каждый объект и сравнивать с каэжым объектом из уже имеющихся. Есть ли какое-то решение
с методом, наподобие нативного filter в js? Могу еще дополнительно скинуть пример кода, как я реализовал это на фронте.
Но там я проверяю только в рамках одной будущей коллекции на этапе ее формирования еще.
//Находим последнее вхождение в нашу коллекцию
app.models.ParsedList.find({},
(_, data) => {
let ID = data[data.length - 1].id
app.models.ParsedList.find({'_id': ID},
(_, data) => {
console.log(data)
})
})
//Обновляем или удаляем наше значение
app.models.ParsedList.findOneAndUpdate(
{_id: '636b7e1d2a6e60a01f4aa6e2', 'file.mail': 'test' },
{
$set: {
'file.$.mail': 'test'
}
// , $unset: { 'file.$.phone': '1' }
},
{new: true},
(_, data) => {
console.log(data)
}
)
А не хотите просто запретить использовать разные названия полей для одного и того же?
Nick
ASAP
Фаинд или агрегация по значению, в один запрос
app.models.ParsedList.updateMany(
{'file.deposited': '0'},
{
$set: {
'file.$[].mail': 'test'
}
// $unset: {'file.$[].mail': '1'}
},
{new: true},
(_, data) => {
console.log(data)
}
)
есть еще такой метод, который просто все вхождения из query заменит везде, где найдет. но я не понимаю, как ему давать каждый раз правильную query
ASAP
и нужно каждый раз давать ему новый query, если у меня много элементов, правильно понимаю?
Nick
Nick
Alex
Ребята пытался локально установить на Ubuntu 22 MongoDB, но ни файлы в tgz не работают после распаковки и server и mongos не инсталяться! Уже перепробовал версию Ubuntu 20.04, Debian 11, 10. Версии 22.04 нет там. В зеркале яндекса тоже не увидел Монго. Кто может подсказать, как установить?
fenogentov
Αρτέμιος
Serb
Могу ли я внутри документа сослаться на поле в этом же документе? Заранее спасибо
Dmitry