经过多次调整,java查询mongo我们采取了分级查询。首先我定义一下下面提到的名词
条件元组(object ):查询条件的元组,比如object={"keyValue":"5***********0024","keyType":"A"}
实际查询条件(arr): 外部接口调用我们接口会传递不定数量的条件元组,比如arr=[{"keyValue":"5***********0024","keyType":"A"},{"keyValue":"5***********0024","keyType":"A"},{"keyValue":"5***********0024","keyType":"A"}],这些元组都是OR条件。查询条件数量1-500+不等
条件元组数量(size): 实际查询条件的数量 size=arr.length
-----------------------------------------------------分隔符-----------------------------------------------------------------
keyType和keyValue我们建立了联合索引,每次查询筛选条件有keyType、keyValue、date(没有索引)
if(size<5){
逐条object 查询,查询条件只有keyType和keyValue ;
对每一次查询出的数据在内存中根据date进行筛选;
将筛选后的结果添加到结果List中
}else if(size>=5&&size<=50){
将所有的object组成Or条件查询,比如{or:[{"keyValue":"5***********0024","keyType":"A",date:'2017-09-17'},{"keyValue":"5***********0024","keyType":"A",,date:'2017-09-17'}},{"keyValue":"5***********0024","keyType":"A",date:'2017-09-17'}}]}
执行一次查询
}else if(size>50){
用多线程查询,50条分为一个线程,每个线程查询方式和第二种情况一致
}
这就是我们现在改造的结果,这个结果是多次优化后的结果。