MongoDB查询索引$ gt和$ ne

询问

我有这样的查询:

db.sample.find({ bool1: false, theNull: null, existing: {$ne: null}, $or: [ { bool2: false, string: {$in: [<array of strings>]}}, { bool2: true, string: {$in: [<array of different strings>]}} ], dateField: {$lt: ISODate(<Given date>)} }).sort({dateField: -1}); 

我正在寻找build立一个最佳的索引查询。 我打了很多,我想做得更好。

查询的部分

我的文档在大多数情况下(99.9%以上)将bool1设置为falsetheNull为null, existing的95%的情况下不为null – 所以我需要这些字段(某处)将其过滤掉。

dateField是我sorting。 现在,我的有趣的数据集是stringbool2 – 这里是我有文档的变化,这基本上是查询过滤。

string总是来自相对包含的一组string(实际上是用户名),而bool2在文档数量非常less的情况下为真。

dateField大部分是连续的,实际的插入时间,但是在这里和那里存在差距,因为在一系列10-100个文档中,我必须将date移回几个月。

我到目前为止做了什么

迄今为止最好的结果是设定这些指标:

 { string: 1, bool2: 1, creation_time: 1} 

与…结合(ORed)

 {string: 1, bool2: 1} 

我不确定用什么最好的索引策略来使用这个特定的查询。

我试着在查询中上下移动很多东西(例如,将existing一切移到下面或者在$或者下面)。

另外,我已经尝试在各种组合中为所有这些字段添加索引。 运行explain的时候,我经常会遇到这样的情况:使用在我的string上设置的索引,并且使用bool2或者另一个索引或者string bool2dateField

我可以把bool ,那些在这个索引前面的那些theNullexisting或各种各样的组合,但是他们没有被使用。

我想知道这是为什么,如果我能得到更好的performance(如果有的话,取得更less的文档),如果我可以在这些文档更广泛的索引。

这将是我会尝试的第一个索引:

 { string: 1, creation_time: -1} 

由于您的大部分变体都是以string因此是过滤的最佳列。 当查询顺序和索引顺序匹配时,我还以降序添加了creation_time ,因为性能更好。

你也可以通过joinbool2来获得更好的结果:

 { string: 1, bool2: 1, creation_time: -1}