mongodb 3.2.7不使用复合索引的排序

mongodb 3.2.7不使用复合索引的排序,mongodb,mongodb-query,Mongodb,Mongodb Query,我使用的是mongodb 3.2.7,文档如下: { "finished" : true, "buildNo": 1, "tryTimes" : 1, "createdTime" : ISODate("2019-05-16T19:00:50.604+08:00"), "modifiedTime" : ISODate("2019-12-27T18:33:25.682+08:00"), } 我使用以下方法创建索引: db.getCollection('bui

我使用的是mongodb 3.2.7,文档如下:

{
    "finished" : true,
    "buildNo": 1,
    "tryTimes" : 1,
    "createdTime" : ISODate("2019-05-16T19:00:50.604+08:00"),
    "modifiedTime" : ISODate("2019-12-27T18:33:25.682+08:00"),
}
我使用以下方法创建索引:

db.getCollection('builds').createIndex({"createdTime": 1})
db.getCollection('builds').createIndex({"tryTimes": 1, "createdTime": -1})
我的问题是:

db.getCollection('builds').find({
"createdTime": {$lte: new Date("2020-04-15T00:00:00.000Z"), $gte: new Date("2020-04-01T00:00:00.000Z")},
"buildNo": 1, 
"finished": {$ne: true}
})
.sort({"tryTimes": 1, "createdTime": -1})
.limit(200)
但是这个查询没有使用我以前创建的索引。explain()输出:

即使我试图将查询简化为

db.getCollection('builds')
.find({ "buildNo": 1,  "finished": true })
.sort({"tryTimes": 1, "createdTime": -1})
.limit(200)
,索引仍然不起作用

最重要的是:我在另一个mongondb版本上使用相同的索引和查询。3.4.14.3. 索引工作

任何想法都受到欢迎和赞赏


非常感谢

如果一个查询可以由集合中定义的多个索引来满足(因为Mongo实际上选择了所有可能相关的索引,所以不能使用满足),那么MongoDB将并行测试所有适用的索引(这意味着Mongo执行“竞争”)。查询计划器将选择第一个可以返回101个结果的索引

这意味着对于特定的查询,使用“错误”索引的查询将获胜

你能做什么

您可以使用,提示基本上强制Mongo使用特定的索引,但不建议使用Mongo,因为如果发生更改,Mongo将无法适应这些更改

像这样:

db.getCollection('builds')
.find({ "buildNo": 1,  "finished": true })
.sort({"tryTimes": 1, "createdTime": -1})
.limit(200)
.hint({tryTimes: 1, createdTime: -1})

非常感谢,汤姆。这真的很有帮助。我想我会让mongo决定使用哪个索引。另一个问题:我们如何判断是“错误的”索引赢了,还是我们创建的索引不合适。你不知道你创建的索引是否合适(有时很明显,但有时需要测试以找到最佳索引)。此外,对于查询代码,也没有实际的方法知道什么是“正确”或“错误”索引,这就是Mongo选择race方法的原因。我使用的经验法则是根据我的需要创建定制的索引(通常是多字段复合索引),如果我突然获得不好的意外性能,几乎总是由于Mongo使用了错误的索引。
db.getCollection('builds')
.find({ "buildNo": 1,  "finished": true })
.sort({"tryTimes": 1, "createdTime": -1})
.limit(200)
.hint({tryTimes: 1, createdTime: -1})