Mongodb索引获取的数据太多,无法进行排序



好吧,我找不到答案,这是我的问题。。。

首先,我有一个通用的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_itemsobject_id将添加到where()标准中,您还需要included上的索引,最后是position字段进行排序。

MongoDB(如2.4所示)每个查询只使用一个索引,因此在object_items上确保最佳搜索(没有内存排序)的预期索引是:

{object_id:1, included:1, position:1}

您还没有提到您在Rails中使用的ODM框架(即Mongoid、MongoMapper等),但应该有声明索引的规定。。或者您可以通过mongoshell确保它是一次性的。

例如,在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的查询分析,以便捕获正在生成的实际查询,然后在mongoshell中explain()生成的查询。

最新更新