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

如何在Java中高效地查询嵌套的mongodb字段?,java,performance,mongodb,Java,Performance,Mongodb,我对从Java运行Mongo查询不是很有经验,所以我不擅长命令。我有一个Mongo集合,包含约6500个文档,每个文档包含多个字段,其中一些字段有子字段,如下所示: "_id" : NumberLong(714847), "franchiseIds" : [ NumberLong(714848), NumberLong(714849) ], "profileSettings" : { "DISCLAIMER_SETUP" : { "settingType"

我对从Java运行Mongo查询不是很有经验,所以我不擅长命令。我有一个Mongo集合,包含约6500个文档,每个文档包含多个字段,其中一些字段有子字段,如下所示:

"_id" : NumberLong(714847),
"franchiseIds" : [
    NumberLong(714848),
    NumberLong(714849)
],
"profileSettings" : {
    "DISCLAIMER_SETUP" : {
        "settingType" : "DISCLAIMER_SETUP",
        "attributeMap" : {
... 
我想有一个操作,将通过整个收集不时计算有多少特许经营权ID存在,因为不同的文件可能有1至4个特许经营权ID

从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中不起作用,因为它必须为加载的所有概要文件分配内存。在Mongo shell脚本中,Mongo只是自己处理这个问题吗

你知道我如何用Java做类似的事情吗

编辑: 在Mongo的回复中,我只返回了特许经营ID字段,这非常有帮助。以下是改进的代码:

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;

Java版本的速度较慢,因为它必须将所有选定的记录从数据库传输到客户端,以便可以对它们进行迭代。您可以通过提供选择标准并只返回特许ID数组来加快Java版本的速度,因为这就是您所需要的。谢谢,这确实大大加快了速度。从约15秒到约1100ms。