对于我们的应用程序,我正在使用 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参数是日期对象或传递的 ISOStrings 以定义日期范围。
这里我调用查询,对结果进行排序:
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 “解释”查询和执行的屏幕截图。