为什么indexonly属性值从mongodb解释查询输出为false

Paw*_*wan 2 mongodb

我有一个简单的集合customers ,如下所示

 db.customers.find().pretty()

{
        "_id" : ObjectId("524eb09ca71b72672e65ebb6"),
        "name" : "kiran",
        "occupation" : "SelfEmployeed",
        "country" : "IND"
}
{
        "_id" : ObjectId("524eb0a4a71b72672e65ebb7"),
        "name" : "Mark",
        "occupation" : "Architect",
        "country" : "US"
}
{
        "_id" : ObjectId("524eb0aba71b72672e65ebb8"),
        "name" : "beast",
        "occupation" : "housewife",
        "country" : "UK"
}
{
        "_id" : ObjectId("524eb0b2a71b72672e65ebb9"),
        "name" : "Philip",
        "occupation" : "Engineer",
        "country" : "SWE"
}
Run Code Online (Sandbox Code Playgroud)

我已经在名称和国家/地区字段上创建了索引,如下所示

 db.customers.ensureIndex({name : 1}, {"unique" : false})



db.customers.ensureIndex({country : 1}, {"unique" : false})
Run Code Online (Sandbox Code Playgroud)

索引已创建

 db.customers.getIndexKeys()
Run Code Online (Sandbox Code Playgroud)

[{"_ id":1},{"name":1},{"country":1}]

这是我的查询解释的结果

db.customers.find({name : "Mark"}).explain()

{
        "cursor" : "BtreeCursor name_1",
        "isMultiKey" : false,
        "n" : 1,
        "nscannedObjects" : 1,
        "nscanned" : 1,
        "nscannedObjectsAllPlans" : 1,
        "nscannedAllPlans" : 1,
        "scanAndOrder" : false,
        "indexOnly" : false,
        "nYields" : 0,
        "nChunkSkips" : 0,
        "millis" : 0,
        "indexBounds" : {
                "name" : [
                        [
                                "Mark",
                                "Mark"
                        ]
                ]
        },
        "server" : "************"
}
Run Code Online (Sandbox Code Playgroud)

为什么indexonly属性值是false?

我见过类似的问题,这个问题解释了它的原因

indexonly是false,因为它不会仅使用索引,因为您将通过该查询检索未编制索引的其他字段.

请让我知道其他领域在这里意味着什么?

Sam*_*aye 7

有些搜索实际上会让你在前一段时间回答这个问题.

原因是这样的:

db.customers.find({name : "Mark"}).explain()
Run Code Online (Sandbox Code Playgroud)

没有预测,在这种情况下,MongoDB如何知道索引覆盖了返回而不查看实际文档?

它类似于

SELECT * from customers
Run Code Online (Sandbox Code Playgroud)

SELECT d from customers
Run Code Online (Sandbox Code Playgroud)

你怎么能知道*d不看?

  • @PreethiJain尝试`db.customers.find({name:"Mark"},{name:1,_id:0}).explain()`,它应该是`indexOnly:true`. (4认同)