Ilya
Хорошо, спасибо, буду думать пока
yopp
Вы скажите что вы храните
yopp
Такие большие числа нигде практически не нужны
ikasymov
Я что могу взять дату создание с ObjectId у документа?
ikasymov
Хм, только что получилось взять
𝕬𝖗𝖙𝖊𝖒
Dmitriy
но так делать не рекомендуется в силу различных обстоятельств
ikasymov
Сответсвенно сгенерировав нужный мне objectid могу фильтровать по дате
Dmitriy
поищите по чату, были уже обсуждения по поводу даты в objectid
ikasymov
Проблема такая что я не добавил поле датасоздание, а у старых надо вытащить даты и фильтровать по ним
Dmitriy
перформанс данной операции мне кажется будет сильно проигрывать простому добавлению поля с временной меткой
Dmitriy
Dmitriy
и дальше уже работайте с этим новым полем
Антон
Здравствуйте, поле в запросе к монге с одной стороны больше чем некоторое значение с другой стороны меньше, хотим получить пересечение. Но монга не создает в индексе ключи с разным порядком по одному полю. И на пересечения индексов много ограничений. Есть способ быстро выполнять запрос такого типа?
Гена
Народ, может кто-то работал с кубером+монго. И у кого то есть готовый yaml файл
Буду очень признателен
У меня никак не получается туда запилить сертификаты
Nick
yopp
yopp
И что сейчас в explain с exexutionStats? почему вы считаете что два индекса должно быть быстрее?
Антон
ничего не понятно, давайте пример что ли для ясности
db.collection.explain("executionStats").aggregate([{'$match': {some_field: 123}}, {'$match': {'$expr': {'$gte': ['date', ISODate("2013-02-19T13:52:01.935Z")]}}}, {'$match': {'$expr': {'$lte': ['date', ISODate("2013-08-19T13:52:01.935Z")]}}},{'$sort': {'date': -1}}, {'$skip': 0}, {'$limit': 50}], { hint: {some_field: 1, date : -1} })
Nick
Антон
Nick
в матче можно указывать несолько услвоий сразу
yopp
17503705
Это результат применения фильтра?
yopp
А сколько всего документов в коллекции?
Антон
35087666
Nick
ммм половина)
yopp
Треть коллекции в запросе. Сомневаюсь что вам помогут индексы
Антон
db.collection.explain("executionStats").aggregate([{'$match': {some_field: 123}}, {'$match': {'$expr': {'$lte': ['date', ISODate("2013-08-19T13:52:01.935Z")]}}},{'$sort': {'date': -1}}, {'$skip': 0}, {'$limit': 50}], { hint: {some_field: 1, date : -1} })
yopp
Пересечение тут точно не поможет, потому что два множества будут огромными и я сомневаюсь что планировщик выберет такую стратегию
Антон
Антон
хотя выборка огромна
yopp
Вы результат explain покажите в обоих случаях
𝕬𝖗𝖙𝖊𝖒
Воу, почему бы на пастебин или на что-то подобное не кинуть? Или сократить код до минимума, чтобы осталась важная его часть
Антон
пару мин
Антон
db.collection.explain("executionStats").aggregate([{'$match': {some_field: 123}}, {'$match': {'$expr': {'$lte': ['$date', ISODate("2019-07-19T13:52:01.935Z")]}}}, {'$sort': {'date': -1}},{'$skip': 0},{'$limit': 50}], { hint: {some_field: 1, date : -1} })
https://pastebin.com/sTsByk6P
Антон
проблемный запрос
db.collection.explain("executionStats").aggregate([{'$match': {some_field: 123}}, {'$match': {'$expr': {'$gte': ['$date', ISODate("2019-05-19T13:52:01.935Z")]}}}, {'$match': {'$expr': {'$lte': ['$date', ISODate("2019-07-19T13:52:01.935Z")]}}}, {'$sort': {'date': -1}},{'$skip': 0},{'$limit': 50}], { hint: {some_field: 1, date : -1} })
https://pastebin.com/k3JTDbvY
Nick
Антон
db.collection.explain("executionStats").aggregate([{'$match': {'$expr': {$and: [{'$eq': ['some_field', 123]}, {'$gte': ['$date', ISODate("2019-05-19T13:52:01.935Z")]}, {'$lte': ['$date', ISODate("2019-07-19T13:52:01.935Z")]}]}}}, {'$sort': {'date': -1}},{'$skip': 0},{'$limit': 50}], { hint: {some_field: 1, date : -1} })
стало хуже, "executionTimeMillis" : 243784, "totalKeysExamined" : 35087670, "totalDocsExamined" : 35087670,
то есть планировщик сказал что использовал индекс но приэтом пробежался почти по всем документам
Nick
db.collection.explain("executionStats").aggregate([{'$match': {'$expr': {$and: [{'$eq': ['some_field', 123]}, {'$gte': ['$date', ISODate("2019-05-19T13:52:01.935Z")]}, {'$lte': ['$date', ISODate("2019-07-19T13:52:01.935Z")]}]}}}, {'$sort': {'date': -1}},{'$skip': 0},{'$limit': 50}], { hint: {some_field: 1, date : -1} })
стало хуже, "executionTimeMillis" : 243784, "totalKeysExamined" : 35087670, "totalDocsExamined" : 35087670,
то есть планировщик сказал что использовал индекс но приэтом пробежался почти по всем документам
уберите хинт
Nick
db.collection.explain("executionStats").aggregate([{'$match': {'$expr': {$and: [{'$eq': ['some_field', 123]}, {'$gte': ['$date', ISODate("2019-05-19T13:52:01.935Z")]}, {'$lte': ['$date', ISODate("2019-07-19T13:52:01.935Z")]}]}}}, {'$sort': {'date': -1}},{'$skip': 0},{'$limit': 50}], { hint: {some_field: 1, date : -1} })
стало хуже, "executionTimeMillis" : 243784, "totalKeysExamined" : 35087670, "totalDocsExamined" : 35087670,
то есть планировщик сказал что использовал индекс но приэтом пробежался почти по всем документам
и укберите $expr
Антон
и укберите $expr
"errmsg" : "unknown top level operator: $gte"
match не парсит внутренние операции монги без expr
Nick
Антон
как сечас запрос выглядит?
db.collection.explain("executionStats").aggregate([{'$match': {$and: [{'$gte': ['$date', ISODate("2019-05-19T13:52:01.935Z")]}, {'$lte': ['$date', ISODate("2019-07-19T13:52:01.935Z")]}, {'$eq': ['some_field', 123]}]}}, {'$sort': {'date': -1}},{'$skip': 0},{'$limit': 50}])
Антон
уберите хинт
db.collection.explain("executionStats").aggregate([{'$match': {'$expr': {$and: [{'$gte': ['$date', ISODate("2019-05-19T13:52:01.935Z")]}, {'$lte': ['$date', ISODate("2019-07-19T13:52:01.935Z")]}, {'$eq': ['some_field', 123]}]}}}, {'$sort': {'date': -1}},{'$skip': 0},{'$limit': 50}])
планировщик выбрал другой индекс, {date: -1}
Антон
при этом время так же большое "executionTimeMillis" : 115233, и сканирует очень много "totalKeysExamined" : 35087670 "totalDocsExamined" : 35087670
Nick
в таком ключе переделайте
Nick
не забудьте только lte
yopp
yopp
В проблемном запросе в bounds по date: MinKey, MaxKey. Значит планировщик не может наложить шейп на это поле и ему приходится проезжать по всему префиксу some_field
yopp
И теперь там есть правильный bounds у date?
Антон
yopp
https://docs.mongodb.com/manual/reference/operator/query/expr/#behavior
$expr does not support multikey indexe
yopp
$expr вообще не нужен если у вас там нет какой-то адской математики над полями документов
Антон
причем планировщик использует индекс {some_field: 1, date: -1, new_some_field: 1}
new_some_field - в запросе нет, при этом индекс {some_field: 1, date: -1} на коллекции есть, почему так происходит?
yopp
Потому что планировщик при сравнении скорости выполнения разных планов по этому индексу получил результаты быстрее
yopp
Потом если у вас один индекс является префиксом другого, то такой индекс во многих случаях будет излишним
Антон
понял, спасибо за объяснения и помощь!
Vova
Использую $project в aggregate и там следующее условие
{ PassedTasksCount: { $size: "$PassedTasks" } }
проблема в том что после этой проекции теряется весь $$ROOT объект, как правильно выйти из ситуации?
Nick
Dmitry
Ребзя, а mongo DB atlas который free и до 512 Мб могу я использовать в своих коммерческих целях? (инет магазин и тп)?
Dmitry
Dmitry
Dmitriy
https://www.mongodb.com/legal/privacy-policy
Dmitry
yopp
Dmitry
Приблизительно 1 из 10 авторизаций весит (PENDING). Вопрос к моему серверу (localhost:5000) или дело может быть в БД? Использую mongoDB atlass
yopp
На этот вопрос только вы сами можете ответить. Смотрите логи, берите в руки отладочные инструменты