好的,我找不到答案所以这是我的问题......
首先,我有一个普通的mongodb问题。我有一个单独的数据库服务器上有mongodb。我是否需要运行rake任务以在Rails应用服务器或数据库服务器上添加索引?
我一直收到错误“mongo sort for(没有索引)的数据太多。添加一个索引或指定一个更小的限制”
当我查看索引时,这就是我得到的:
{
"v" : 1,
"key" : {
"_id" : 1
},
"ns" : "app.object_items",
"name" : "_id_"
},
{
"v" : 1,
"key" : {
"object_id" : 1
},
"ns" : "app.object_items",
"name" : "object_id_1",
"background" : true
}
我的关系是对象has_many object_items和object_items属于object。
导致数据错误太多的查询是:
@ object.object_items.where(included:false).sort_by(&:position).first(25)
@ object.object_items.count = 54所以我们这里不是在讨论很多数据。
这是我设置的索引的问题还是我错过了一些简单的东西?
提前致谢。
BR
答案 0 :(得分:2)
导致数据错误太多的查询是:
@ object.object_items.where(included:false).sort_by(&:position).first(25)
根据您的索引列表,您缺少一个符合此条件的条件和排序顺序的索引。我认为,由于您的object
has_many object_items
,object_id
正在添加where()
条件,您还需要included
上的索引最后是用于排序的position
字段。
MongoDB(在2.4中)每个查询只使用一个索引,因此确保在object_items
上进行最佳搜索(没有内存排序)的预期索引是:
{object_id:1, included:1, position:1}
你还没有提到你使用Rails的ODM框架(即Mongoid,MongoMapper,..),但应该有声明索引的规定..或者你可以通过{确保它是一次性的{1}} shell。
例如,在Mongoid中,您可以使用object_items类中的mongo
宏define an index:
index
@ object.object_items.count = 54所以我们这里不是在讨论很多数据。
limit for an in-memory sort为32MB(至少对于MongoDB 2.2 / 2.4)。
在您的示例中,我认为index({object_id:1, included:1, position:1})
计数具有误导性,因为只会包含与object.object_items
匹配的object_items
。实际生成的查询可能正在检查大量数据。
理解查询的更好方法是在该级别2的enable query profiling处捕获正在生成的实际查询,然后在object
explain()
生成的查询} shell。