gpt4 book ai didi

mongodb - 为什么带索引的查询不是覆盖查询?

转载 作者:可可西里 更新时间:2023-11-01 10:02:50 27 4
gpt4 key购买 nike

您想对 example 集合执行覆盖查询。您有以下索引:

{ name : 1, dob : 1 }
{ _id : 1 }
{ hair : 1, name : 1 }

为什么下面的查询不是 covered query

db.example.find( { name : { $in : [ "Bart", "Homer" ] } }, {_id : 0, hair : 1, name : 1} )

虽然这个是:

db.example.find( { name : { $in : [ "Bart", "Homer" ] } }, {_id : 0, dob : 1, name : 1} )

最佳答案

根据 index prefixes 上的文档, 查询

db.example.find( { name : { $in : [ "Bart", "Homer" ] } } );

将被覆盖

db.example.createIndex({ "name": 1, "dob": 1 }); 

但不是通过

db.example.createIndex({ "hair": 1, "name": 1 }); 

因为 { "name": 1 } 不是 { "hair": 1, "name": 1 } 的前缀。

示例

{ "_id": 1, "name": "Bart", "hair": "triangles", "dob": "1985-01-01" }
{ "_id": 2, "name": "Homer", "hair": "two", "dob": "1960-01-01" }

查询 1

> db.example.find(
> { name: { $in: [ "Bart", "Homer" ] } },
> { _id: 0, hair: 1, name: 1 }
> ).explain("executionStats");
...
"executionStats": {
"totalKeysExamined": 2,
"totalDocsExamined": 2,
"executionStages": {
"stage": "PROJECTION",
"inputStage": {
"stage": "FETCH",
"inputStage": {
"stage": "IXSCAN",
"indexName": "name_1_dob_1",
...

如您所见,使用了 name_1_dob_1 索引(因为 { "name": 1 }{ "name": 1, "dob ": 1 ,在索引中检查了 2 个文档 ("totalKeysExamined": 2),然后在集合中检查了 2 个文档 ("totalDocsExamined": 2), 因为 name_1_dob_1 索引没有需要返回的关于 hair 的信息。

查询 2

> db.example.find(
> { name: { $in: [ "Bart", "Homer" ] } },
> { _id: 0, dob: 1, name: 1 }
> ).explain("executionStats");
...
"executionStats": {
"totalKeysExamined": 2,
"totalDocsExamined": 0,
"executionStages": {
"stage": "PROJECTION",
"inputStage": {
"stage": "IXSCAN",
"indexName": "name_1_dob_1",
...

对于查询 1,使用了索引 name_1_dob_1 并在索引中检查了 2 个文档 ("totalKeysExamined": 2),但是没有调用集合 ("totalDocsExamined": 0),因为索引 name_1_dob_1 包含 dobname,并且有无需从集合中获取更多内容。

关于mongodb - 为什么带索引的查询不是覆盖查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39317980/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com