我想从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进行聚合对群集中的帮助或分片是否会有所帮助?
我将非常感谢您提供任何帮助或解决问题的方法。
感谢。
答案 0 :(得分:0)
你的sort()是不必要的,因为你试图只找到appId为20fabc6的文件,那你为什么要按同一个appId排序,因为它对于所有返回的记录都是一样的?
在appId字段
上创建索引db.test.User.ensureIndex({"appId":1})
您的查询应该只扫描900000个文档。您可以使用find上的.explain()方法对性能元数据进行双重检查。
db.test.User.find({"appId": "20fabc6"}).explain()