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