蒙古式索引仍然导致COLLSCAN

问题描述

我有一个带有简单索引的简单类

class A
    include Mongoid::Document

    field :value
    index({value: 1})

在命令行中,我重新索引

bundle exec rake db:mongoid:remove_indexes
bundle exec rake db:mongoid:create_indexes

但是当我在Rails控制台中运行一个简单查询

A.where(value: "1").to_a

mongodb日志清楚地显示了COLLSCAN

command test_development.a command: find { find: "a",filter: { value: "1" },$db: "test_development",lsid: { id: UUID("fa470127-398a-4f06-9a17-57b058017cf7") } }   
planSummary: COLLSCAN keysexamined:0 docsexamined:816688 cursorExhausted:1 
numYields:6380 nreturned:0 

我在做什么错了?

更新-添加了其他信息:

db.case_data.getIndexSpecs()
[
    {
            "v" : 2,"key" : {
                    "_id" : 1
            },"name" : "_id_","ns" : "simple_development.case_data"
    },{
            "v" : 2,"key" : {
                    "_fts" : "text","_ftsx" : 1
            },"name" : "value_text","ns" : "simple_development.case_data","weights" : {
                    "value" : 1
            },"default_language" : "english","language_override" : "language","textIndexVersion" : 3
    }
]

说明的输出

db.case_data.find({value: "test"}).explain()
{
    "queryPlanner" : {
            "plannerVersion" : 1,"namespace" : "simple_development.case_data","indexFilterSet" : false,"parsedQuery" : {
                    "value" : {
                            "$eq" : "test"
                    }
            },"queryHash" : "7E4E9C25","planCacheKey" : "7E4E9C25","winningPlan" : {
                    "stage" : "COLLSCAN","filter" : {
                            "value" : {
                                    "$eq" : "test"
                            }
                    },"direction" : "forward"
            },"rejectedplans" : [ ]
    },"serverInfo" : {
            "host" : "msc-2","port" : 27017,"version" : "4.2.8","gitVersion" : "43d25964249164d76d5e04dd6cf38f6111e21f5f"
    },"ok" : 1
}

解决方法

我不知道为什么这样创建索引,可能是因为您没有在模型类中指定字段的类型。尝试指定字段的类型,然后将索引手动放在mongo shell db.getCollection('X').dropIndex('value_text')中,然后运行rake以创建索引rake db:create_indexes

如果这不起作用,我将删除索引并在mongo shell db.getCollection('X').createIndex({'value': 1},{name: 'value_1',background: true})中手动创建一个索引(或等待更好的答案?)

,

在Mongoid 7.1.1和mongodb 4.2.9的某种组合中,rake任务和mongorestore都实际上并未重新创建索引。他们说可以,但是不可以。

此命令导致COLLSCAN:

bundle exec rake db:mongoid:remove_indexes
bundle exec rake db:mongoid:create_indexes

使用mongo控制台创建索引,或者在每个模型中,在Rails控制台中执行以下操作:

A.remove_indexes
A.create_indexes

没有结果。

我已经用干净的数据库还原科学地重复了这一过程,并且可以肯定地说rake命令和mongorestore命令不会重新创建索引。我上面的解决方案解决了这个问题。

感谢大家的帮助, 凯文