我正在使用mongodb 2.6,我有以下查询:

db.getCollection('Jobs').find(
{ $and: [ { RunID: { $regex: ".*_0" } },
          { $or: [  { JobType: "TypeX" },
                    { JobType: "TypeY" },
                    { JobType: "TypeZ" },
                    { $and: [ { Info: { $regex: "Weekly.*" } }, { JobType: "YetAnotherType" } ] } ] } ] })

我有三个不同的索引:RunIDRunID + JobTypeRunID + JobType + Info。mongo总是只使用包含runid的索引,尽管其他索引似乎更可能产生更快的结果,但它有时甚至使用包含RunID + StartTime的索引,而starttime甚至不在已用字段列表中,知道它为什么选择该索引吗?

最佳答案

注1:
您可以删除前两个索引RunIDRunID + JobType。只使用扩展的复合索引就足够了;它还可以用于查询RunID + JobType + InfoRunID字段,info here
除了支持匹配所有索引字段的查询之外,
复合索引可以支持与
索引字段。
当您删除这些索引时,mongo将选择剩下的唯一索引。
注2:
您始终可以使用hint,告诉mongo使用特定索引:

db.getCollection('Jobs').find().hint({RunID:1, JobType:1, Info:1})

10-06 08:29