Ilya
Хорошо, спасибо, буду думать пока
yopp
Вы скажите что вы храните
yopp
Такие большие числа нигде практически не нужны
ikasymov
Я что могу взять дату создание с ObjectId у документа?
𝕬𝖗𝖙𝖊𝖒
Я что могу взять дату создание с ObjectId у документа?
Мне кажется, нет. Для этого нужно брать данное время и добавлять его в документ.
ikasymov
Хм, только что получилось взять
𝕬𝖗𝖙𝖊𝖒
Dmitriy
Я что могу взять дату создание с ObjectId у документа?
можете, первые 4 байта это временная метка: https://docs.mongodb.com/manual/reference/method/ObjectId/
Dmitriy
но так делать не рекомендуется в силу различных обстоятельств
ikasymov
Сответсвенно сгенерировав нужный мне objectid могу фильтровать по дате
Dmitriy
поищите по чату, были уже обсуждения по поводу даты в objectid
ikasymov
Проблема такая что я не добавил поле датасоздание, а у старых надо вытащить даты и фильтровать по ним
Dmitriy
Сответсвенно сгенерировав нужный мне objectid могу фильтровать по дате
для простого фильтра это будет оверхэд точно, вам нужно будет разложить objectid, взять первые 4 байта, преобразовать в временную метку и каким-то образом отфильтровать
Dmitriy
перформанс данной операции мне кажется будет сильно проигрывать простому добавлению поля с временной меткой
Dmitriy
Проблема такая что я не добавил поле датасоздание, а у старых надо вытащить даты и фильтровать по ним
сделайте миграцию, которая один раз по objectid получит даты и проставит их в новое поле
Dmitriy
и дальше уже работайте с этим новым полем
Alexander
для простого фильтра это будет оверхэд точно, вам нужно будет разложить objectid, взять первые 4 байта, преобразовать в временную метку и каким-то образом отфильтровать
Всё проще же: можно руками составить два oid с правильными первыми байтами и искать ренджи. Я делал такое как-то и оно вполне работало. Но конечно не, это не отменяет того факта, что лучше отмигрировать данные и добавить нормальное поле.
yopp
Проблема такая что я не добавил поле датасоздание, а у старых надо вытащить даты и фильтровать по ним
Это не очень точно, но вы можете попробовать единоразово ретроспективно вытащить в отдельное роле и попробовать руками провалидировать правильность
Антон
Здравствуйте, поле в запросе к монге с одной стороны больше чем некоторое значение с другой стороны меньше, хотим получить пересечение. Но монга не создает в индексе ключи с разным порядком по одному полю. И на пересечения индексов много ограничений. Есть способ быстро выполнять запрос такого типа?
Гена
Народ, может кто-то работал с кубером+монго. И у кого то есть готовый yaml файл Буду очень признателен У меня никак не получается туда запилить сертификаты
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
в матче можно указывать несолько услвоий сразу
yopp
17503705
Это результат применения фильтра?
Антон
И что сейчас в explain с exexutionStats? почему вы считаете что два индекса должно быть быстрее?
это предположение потому что сейчас если колличесво some_field маленькое то все быстро, если большое то индекс пытается пройтись по ключам date причем в обратном порядке но из за gte идет по всем документам попавшим после фильтра some_field
Антон
Это результат применения фильтра?
это сканирование по ключам и документам -totalKeysExamined и totalDocsExamined
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
Антон
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
"errmsg" : "unknown top level operator: $gte" match не парсит внутренние операции монги без expr
Антон
как сечас запрос выглядит?
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
при этом время так же большое "executionTimeMillis" : 115233, и сканирует очень много "totalKeysExamined" : 35087670 "totalDocsExamined" : 35087670
db.getCollection('sts').aggregate([{ '$match': { $and: [{ 'date': {$gte: ISODate("2019-05-19T13:52:01.935Z")} }, { 'some_field':{$eq: 123} } ] } } ])
Nick
в таком ключе переделайте
Nick
не забудьте только lte
yopp
В проблемном запросе в bounds по date: MinKey, MaxKey. Значит планировщик не может наложить шейп на это поле и ему приходится проезжать по всему префиксу some_field
Антон
db.getCollection('sts').aggregate([{ '$match': { $and: [{ 'date': {$gte: ISODate("2019-05-19T13:52:01.935Z")} }, { 'some_field':{$eq: 123} } ] } } ])
db.collection.explain("executionStats").aggregate([{'$match': {$and: [{'some_field': {'$eq': 123}}, {'date': {'$gte': ISODate("2019-05-19T13:52:01.935Z")}}, {'date': {'$lte': ISODate("2019-07-19T13:52:01.935Z")}}]}}, {'$sort': {'date': -1}},{'$skip': 0},{'$limit': 50}]) "executionTimeMillis" : 1 "totalKeysExamined" : 0, "totalDocsExamined" : 0
Антон
А зачем там $expr?
видимо действительно не нужен
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 объект, как правильно выйти из ситуации?
Anonymous
Кто знает почему?
Пмушто mongodb atlas надо юзать
Dmitry
Ребзя, а mongo DB atlas который free и до 512 Мб могу я использовать в своих коммерческих целях? (инет магазин и тп)?
Dmitriy
Ребзя, а mongo DB atlas который free и до 512 Мб могу я использовать в своих коммерческих целях? (инет магазин и тп)?
а там нет license agreement который с которым надо согласится до момента использования и в котором по идее должны были бы оговариваться подобные вещи?
Dmitriy
Если бы я его читал
https://www.mongodb.com/cloud-terms-and-conditions еще есть шанс)
Dmitriy
https://www.mongodb.com/legal/privacy-policy
Dmitry
https://www.mongodb.com/cloud-terms-and-conditions еще есть шанс)
Ну о запрете я ничего не нашел тут
Dmitry
Приблизительно 1 из 10 авторизаций весит (PENDING). Вопрос к моему серверу (localhost:5000) или дело может быть в БД? Использую mongoDB atlass
yopp
На этот вопрос только вы сами можете ответить. Смотрите логи, берите в руки отладочные инструменты