我对从Java运行Mongo查询不是很有经验,所以我不是命令专家。我有一个包含~6500个文档的Mongo集合,每个文档包含多个字段(其中一些包含子字段),如下所示:
"_id" : NumberLong(714847),
"franchiseIds" : [
NumberLong(714848),
NumberLong(714849)
],
"profileSettings" : {
"DISCLAIMER_SETUP" : {
"settingType" : "DISCLAIMER_SETUP",
"attributeMap" : {
...
我希望有一个操作可以不时地浏览整个系列,并计算出有多少特许经营权,因为不同的文件可能有1到4个特许经营权。
从Mongo shell中,我做了一个非常简单的脚本来获取它,并立即计算结果:
rs_default:SECONDARY> var totalCount = 0;
rs_default:SECONDARY> db.profiles.find().forEach( function(profile) { totalCount += profile.franchiseIds.length } );
rs_default:SECONDARY> totalCount
然而,当我试图在Java中做同样的事情时,这会在服务器上不时运行,它的性能要差得多,大约需要15秒才能完成:
int result = 0;
List<Profile> allProfiles = mongoTemplate.findAll(Profile.class, PROFILE_COLLECTION);
for (Profile profile : allProfiles) {
result += profile.getFranchiseIds().size();
}
return results
我意识到上述在Java中不具备性能,因为它必须为所有正在加载的Profiles分配内存。在Mongo shell脚本中,Mongo只是自己处理这个吗?
我是如何在Java中做类似的事情的?
编辑: 我只返回了来自Mongo的响应中的franchiseIds字段,这有很大帮助。以下是改进的代码:
final Query query = new Query();
query.fields().include(FRANCHISE_IDS);
final List<Profile> allProfiles = mongoTemplate.find(query, Profile.class, PROFILE_COLLECTION);
for (Profile profile : allProfiles) {
result += profile.getFranchiseIds().size();
}
return result;