Для нашего приложения я использую бесплатный уровень (на данный момент) в 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](https://i.stack.imgur.com/RChtA.png)