Mongodb 什么';这是包含日期范围的最佳Mongo索引策略

Mongodb 什么';这是包含日期范围的最佳Mongo索引策略,mongodb,Mongodb,我有以下模式: { a: string; b: date; c: number; } 我的问题是 find({ a: 'some value', b: { $gte: new Date('some date') } }) .sort({ c: -1 }); 我有一个索引是: { a: 1, b: 1, c: 1 } 但它没有使用这个索引 我还有几个其他索引,在分析explain()时,它显示它正在使用多个其他索引来完成我的查询 我相信,因为我的“b”查询

我有以下模式:

{
  a: string;
  b: date;
  c: number;
}
我的问题是

find({
  a: 'some value',
  b: {
    $gte: new Date('some date')
  }
})
.sort({ 
 c: -1
});
我有一个索引是:

{ a: 1, b: 1, c: 1 }
但它没有使用这个索引

我还有几个其他索引,在分析explain()时,它显示它正在使用多个其他索引来完成我的查询

我相信,因为我的“b”查询是一个日期范围,所以这不被认为是一个相等条件,所以这个索引可能不起作用

我应该有两个索引:
{a:1,c:1}和单独的{b:1}

日期往往比其他字段更具选择性,因此当您有一个类似于
{dateField:1,otherField:1}
的索引时,
日期字段的选择性意味着
otherField
将是无用的,除非您有多个项目共享同一日期

根据您的数据分布实际上是什么样子,您可以考虑<代码> {字段:1,DATEFEA:1 }(这意味着mongo可以按排序顺序检查DOC是否匹配您的日期查询)。通常,将排序字段放在范围查询中使用的任何字段之前是一个好主意

是我在索引使用方面见过的最好的资源,他们建议:

使用sort查询的一个好的经验法则是按以下顺序排列索引字段:

  • 首先是要查询精确值的字段
  • 第二,数组中有一个小的$
  • 第三,您将按照与排序本身相同的顺序和规格排序的字段(在多个字段上排序)
  • 最后,您将在其上按从高到低的顺序查询值范围的字段(请参见下面的范围运算符)

谢谢,这很有帮助