好吧,我找不到答案,这是我的问题。。。
首先,我有一个通用的mongodb问题。我有一个单独的数据库服务器,上面有mongodb。我需要在Rails应用服务器上还是在数据库服务器上运行rake任务来添加索引?
我一直收到错误"mongo too data for sort()without no index。add an index or specify a smarth limit">
当我查看索引时,我得到的是:
{
"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
}
我的关系是object has_many object_items和object_item属于object。
我的查询导致了太多的数据错误是:
@object.object_items.where(included:false).sort_by(&:position).first(25)
@object.object_items.count=54,所以我们在这里谈论的不是很多数据。
这是我设置的索引有问题吗?还是我错过了一些简单的东西?
提前谢谢。
BR
导致数据过多错误的查询是:
@object.object_items.where(included:false).sort_by(&:position).first(25)
根据索引列表,您缺少一个与此查询的条件和排序顺序匹配的索引。我假设,由于您的object
有多个object_items
,object_id
将添加到where()
标准中,您还需要included
上的索引,最后是position
字段进行排序。
MongoDB(如2.4所示)每个查询只使用一个索引,因此在object_items
上确保最佳搜索(没有内存排序)的预期索引是:
{object_id:1, included:1, position:1}
您还没有提到您在Rails中使用的ODM框架(即Mongoid、MongoMapper等),但应该有声明索引的规定。。或者您可以通过mongo
shell确保它是一次性的。
例如,在Mongoid中,您可以使用object_items类中的index
宏来定义索引:
index({object_id:1, included:1, position:1})
@object.object_items.count=54,所以我们在这里谈论的不是很多数据。
内存中排序的限制是32MB(至少对于MongoDB 2.2/2.4)。
在您的示例中,我认为object.object_items
计数具有误导性,因为它只包括与object
匹配的object_items
。实际生成的查询可能会检查大量的数据。
理解查询的更好方法是为该数据库启用级别2的查询分析,以便捕获正在生成的实际查询,然后在mongo
shell中explain()
生成的查询。