MongoDB查询优化大型文档 - 数据集 - 查询卡住

时间:2014-12-24 15:10:57

标签: mongodb pymongo mongodb-query spring-data-mongodb mongodb-java

我想从MongoDB专家那里获得mongodb查询优化/功能选项的意见,我可以申请更快地进行读取查询,以便一次性获取大量文档(数据集)(查找查询)。

可能是mongodb社区中的某个人遇到了类似的问题,他们有更好的想法来解决这个问题。

我正在使用MongoDB2.6

要求是在一个查询中获取所有记录,因为这些文档填充在Excel工作表中,供用户在excel中下载数据。

我在用户集合中有大量用户somwhere 2000000文件。

用户收集字段:

{
_id:  ObjectId("54866f133345a61b6b9a701"),
appId: "20fabc6",
firstName: "FN",
lastName: "LN",
email: "ln@1.com",
userType: "I",
active: "true",
lastUpdatedBy: "TN",
lastUpdatedDate: ISODate("2013-01-24T05:00:00Z"),  
createdTime: ISODate("2011-01-24T05:00:00Z"),

}

我有一个查找查询,目前正在寻求从User集合中获取900000个文档。看起来查询在获取大量文档时卡住了。

以下是查询查询:

db.test.User.find({"appId": "20fabc6"}).sort({"appId" : 1});

查询功能:

List<Users> findByAppId(Object[] appIds) {
Query query = new Query();
query.addCriteria(Criteria.where("appId").in(appIds));
return mongoTemplate.find(query, Users.class); 
}

我已将索引放在上面的appId字段上,但查询仍然需要太长时间。

我对查询运行了计数,我可以看到上述查找匹配appId的900000条记录

db.test.User.find({"appId": "20fabc6"}).count();
900000

以下是一些选项,我可以想到哪些可以减少文档数量:

1)添加更多字段以过滤记录 - 仍然是大量的

db.test.User.find({"appId": "20fabc6"}, "active": "true").count();
700000

2)使用mongodb限制操作限制范围查询的no.of记录 - 这将影响我们第一次下载所有用户数据到excel表中的要求。

如果我们必须执行上面的查找查询并一次性获取大量文档(900000),那么使用Cursor进行聚合对群集中的帮助或分片是否会有所帮助?

我将非常感谢您提供任何帮助或解决问题的方法。

感谢。

1 个答案:

答案 0 :(得分:0)

你的sort()是不必要的,因为你试图只找到appId为20fabc6的文件,那你为什么要按同一个appId排序,因为它对于所有返回的记录都是一样的?

在appId字段

上创建索引
db.test.User.ensureIndex({"appId":1})

您的查询应该只扫描900000个文档。您可以使用find上的.explain()方法对性能元数据进行双重检查。

db.test.User.find({"appId": "20fabc6"}).explain()