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