0

对于我们的应用程序,我正在使用 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,
};

其中startend参数是日期对象或传递的 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 “解释”查询和执行的屏幕截图。

链接图片

4

0 回答 0