创建与MongoDB中的查询匹配的复合索引

时间:2019-05-06 10:00:15

标签: mongodb indexing mongodb-query mongodb-compass

对于我们的应用程序,我正在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“解释”查询和执行的屏幕截图。

linked image

0 个答案:

没有答案