Как оптимизировать монго-запрос с двумя параллельными массивами? - PullRequest
0 голосов
/ 09 июля 2019

У меня такой запрос:

xml_db.find(
    {
        'high_performer': {
            '$nin': [some_value]
        },
        'low_performer': {
            '$nin': [some_value]
        },
        'expiration_date': {
            '$gte': datetime.now().strftime('%Y-%m-%d')
        },
        'source': 'some_value'        
    }
)

Я попытался создать индекс с этими полями, но получил ошибку:

pymongo.errors.OperationFailure: невозможно индексировать параллельные массивы [low_performer] [high_performer]

Итак, как эффективно выполнить этот запрос?

1 Ответ

1 голос
/ 09 июля 2019

Порядок составной индексации должен соответствовать правилу equality --> sort --> range.Хорошее описание этого можно найти в этом ответе.

Это означает, что первое поле в индексе будет source, за которым следуют фильтры диапазона (expiration_date, low_performer и high_performer).

Как вы заметили, одно из полей «исполнителя» не может быть включено в индекс, поскольку может быть проиндексирован только один массив.Вы должны использовать свои знания набора данных, чтобы определить, какой фильтр (low_performer или high_performer) будет более избирательным, и выбрать этот фильтр для включения в индекс.

Если предположить, что high_performer является более избирательным, единственным оставшимся шагом будет определение порядка между expiration_date и high_performer.Опять же, вы должны использовать свои знания набора данных, чтобы сделать это определение на основе селективности.

Если предположить, что expiration_date является более избирательным, индекс для создания будет:

{ "source" : 1, "expiration_date" : 1, "high_performer" : 1 }
...