带有$ gt和$ ne的MongoDB查询索引

时间:2016-01-31 23:20:52

标签: node.js mongodb indexing

查询

我有这样的查询:

[ [ ("X",True), ("Y",True), ("Z", True) ],
[ ("X",True), ("Y",True), ("Z", False) ],.... ]

问题

我正在寻找为此构建最佳索引查询。我经常点击那个查询,我想做得更好。

查询的部分

我的文档在大多数情况下(99.9 +%)设置为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}); 的{​​{1}}和bool1为空,而false在95%的情况下为空 - 所以我需要那些字段(某处)来过滤掉它。

theNull就是我的排序。现在,我感兴趣的数据集是existingdateField - 我在那里对文档有变化,而且基本上是查询过滤的内容。

string始终来自相对包含的字符串集(实际上是用户名),bool2在非常少的文档中都是正确的。

string主要与实际插入时间一致,但是在这里和那里存在差距,因为我必须将日期移回几个月才能获得一系列10-100个文档。

到目前为止我做了什么

到目前为止,最好的结果是设置这些索引:

bool2

组合(ORed)与

dateField

我不确定使用此特定查询的最佳索引策略。

我尝试在查询中上下移动很多东西(例如,将{ string: 1, bool2: 1, creation_time: 1} 一直向下移动或者只是低于$或者。)

另外,我尝试将索引添加到各种组合中的所有字段。运行explain时我经常最终得到的是使用我的{string: 1, bool2: 1} existing上设置的索引与另一个索引或stringbool2和{{ 1}}。

我可以将stringbool2dateField或其他各种组合放在该索引前面,但它们不会被使用。

我想知道为什么会这样,如果我能获得更好的性能(或者如果重要的话,可以获得更少的文档),如果我能在这些文档上获得更广泛的索引。

1 个答案:

答案 0 :(得分:1)

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

{ string: 1, creation_time: -1}

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

您也可以通过加入bool2获得更好的结果:

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