Создание составных индексов, которые будут соответствовать запросам в MongoDB - PullRequest
0 голосов
/ 06 мая 2019

Для нашего приложения я использую бесплатный уровень (на данный момент) в MongoDB-Atlas.наши документы имеют, среди прочих полей, время начала, которое является объектом Datetime, и userId int.

export interface ITimer {
    id?: string,
    _id?: string, // id property assigned by mongo
    userId?: number,
    projectId?: number,
    description?: string,
    tags?: number[],
    isBillable?: boolean,
    isManual?: boolean,
    start?: Date,
    end?: Date,
    createdAt?: Date,
    updatedAt?: Date,
    createdBy?: number,
    updatedBy?: number
};

Я ищу индекс, который будет соответствовать следующему запросу:

let query: FilterQuery<ITimer> = {
    start: {$gte: start, $lte: end},
    userId: userId,
};

Где start и end Параметры - это объекты даты или строки ISOS, переданные для определения диапазона дней.

Здесь я вызываю запрос, сортируя результаты:

let result = await collection.find(query).sort({start: 1}).toArray();

Кажется достаточно простым, что следующий индекс будет соответствовать вышеуказанному запросу:

{
    key: {
        start: 1,
        userId: 1,
    },
    name: 'find_between_dates_by_user',
    background: true,
    unique: false,
},

Но, используя mongodb-compass для мониторинга коллекции, я вижу, что этот индекс не используется.Более того, в документации mongodb определенно говорится, что если индекс полностью соответствует запросу, то никакие документы не нужно проверять, а результаты будут основываться только на индексированной информации.к сожалению, для каждого выполняемого запроса я вижу документы, которые проверяются, что означает, что мои индексы не совпадают.

Есть предложения?Я чувствую, что это должно быть очень просто и понятно, но, может быть, я что-то упустил.Прикрепленный снимок экрана с mongodb-compass, «объясняющий» запрос и выполнение.

linked image

...