如何在Java中有效地查询嵌套的mongodb字段?

时间:2015-02-05 20:17:38

标签: java performance mongodb

我对从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;

0 个答案:

没有答案