Mongodb 为什么mongo不';你不能使用正确的索引吗?

Mongodb 为什么mongo不';你不能使用正确的索引吗?,mongodb,Mongodb,我使用MongoDB以以下结构存储数据: { "_id" : ObjectId("5a497a1f451bf00880331913"), "device" : "deviceId", "topic" : "topicId", "vhost" : "vhostId", "date" : ISODate("2018-01-01T00:00:31.220Z"), "value" : 452 } 具有以下索引: [ { "v" : 2,

我使用MongoDB以以下结构存储数据:

{ "_id" : ObjectId("5a497a1f451bf00880331913"), "device" : "deviceId", "topic" : "topicId", "vhost" : "vhostId", "date" : ISODate("2018-01-01T00:00:31.220Z"), "value" : 452 }
具有以下索引:

[
        {
                "v" : 2,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "thingsplay.data"
        },
        {
                "v" : 2,
                "key" : {
                        "device" : 1,
                        "topic" : 1,
                        "date" : 1
                },
                "name" : "device_1_topic_1_date_1",
                "ns" : "thingsplay.data",
                "background" : true
        },
        {
                "v" : 2,
                "key" : {
                        "device" : 1,
                        "topic" : 1,
                        "vhost" : 1
                },
                "name" : "device_1_topic_1_vhost_1",
                "ns" : "thingsplay.data",
                "background" : true
        }
]
但当我用设备、主题和日期字段进行查询时,它使用设备、主题、vhost、索引

对于另一个使用解释选项的请求,我刚刚有了正确的获胜计划(设备\u 1\u主题\u 1\u日期\u 1),但当我执行它时。。。我仍然在等待它完成,并且使用
db.currentOp()
我没有看到它使用任何索引

{
        "desc" : "conn2172",
        "threadId" : "2836",
        "connectionId" : 2172,
        "client" : "x.x.x.x:50177",
        "appName" : "MongoDB Shell",
        "clientMetadata" : {
                "application" : {
                        "name" : "MongoDB Shell"
                },
                "driver" : {
                        "name" : "MongoDB Internal Client",
                        "version" : "3.6.2"
                },
                "os" : {
                        "type" : "Windows",
                        "name" : "Microsoft Windows Server 2008 R2",
                        "architecture" : "x86_64",
                        "version" : "6.1 SP1 (build 7601)"
                }
        },
        "active" : true,
        "opid" : 22137990,
        "secs_running" : 322,
        "microsecs_running" : NumberLong(322246758),
        "op" : "command",
        "ns" : "company.data",
        "query" : {
                "explain" : {
                        "find" : "data",
                        "filter" : {
                                "device" : "deviceId",
                                "topic" : "topicId",
                                "date" : {
                                        "$gt" : ISODate("2018-01-01T00:00:00Z"),

                                        "$lt" : ISODate("2018-06-12T16:18:00Z")
                                }
                        }
                },
                "verbosity" : "executionStats"
        },
        "numYields" : 19245,
        "locks" : {
                "Global" : "r",
                "Database" : "r",
                "Collection" : "r"
        },
        "waitingForLock" : false,
        "lockStats" : {
                "Global" : {
                        "acquireCount" : {
                                "r" : NumberLong(38492)
                        }
                },
                "Database" : {
                        "acquireCount" : {
                                "r" : NumberLong(19246)
                        }
                },
                "Collection" : {
                        "acquireCount" : {
                                "r" : NumberLong(19246)
                        }
                }
        }
}

我不明白为什么没有使用索引…

查询中也有vhost。显然,查询计划员认为此索引更有效。您的查询是什么?@AlexBlex否我没有在查询中指定vhost。。。这就是为什么我不明白为什么它使用那个索引…@MạnhQuyế特恩盖伊ễn我没有这个示例的具体查询,但它看起来像:db.data.find({device:“deviceId”,topic:“topicId”,date:{$gt:ISODate(“2018-01-01T00:00:00.000Z”),$lt:ISODate(“2018-06-13T12:00:00.000Z”)})足够公平。您能否提供解释结果和
allPlansExecution
stats?