首页 > 解决方案 > MongoDB聚合框架在查找时非常慢

问题描述

这是我的方法,当服务器运行这个方法时,需要18s。

但是当我运行相同的查询时,使用 NoSQLBoost,它只需要 5 秒。

public Integer queryUserEduTotal(UserAdminV1StepListRequest body) throws ParseException {

    Criteria criteria = Criteria.where(Column.SYSTEM_STATUS).is(true);
    criteria.and(UserColumn.APP_ID).is(body.getAppId());
    criteria.and(UserColumn.STATUS).is(2);
    Criteria criteria1 = Criteria.where(UserColumn.USER_TYPE).exists(false);
    Criteria criteria2 = Criteria.where(UserColumn.USER_TYPE).is(UserTypeEnum.USER_REGISTER.getKey());
    Criteria criteria3 = new Criteria();
    criteria3.orOperator(criteria1, criteria2);

    criteria.andOperator(criteria3, Criteria.where(UserColumn.SYSTEM_CREATE_TIME).gte(sdf.parse(body.getStart())), Criteria.where(UserColumn.SYSTEM_CREATE_TIME).lte(sdf.parse(body.getEnd())));

    LookupOperation lookup = lookup("user_edu_item_info", "_id", UserEduItemColumn.USER_ID, "edu_info");

    Criteria criteria4 = Criteria.where(Column.SYSTEM_STATUS).is(true);
    criteria4.and(UserColumn.APP_ID).is(body.getAppId());
    criteria4.and("edu_info._id").exists(true);

    Aggregation typedAggregation1 = Aggregation.newAggregation(
            match(criteria),
            lookup,
            match(criteria4),
            Aggregation.count().as(Constant.COUNT)
    );

    AggregationResults<BasicDBObject> aggregationResults = mongoTemplate.aggregate(typedAggregation1, User.class, BasicDBObject.class);
    int count = 0;
    if (aggregationResults.getMappedResults().size() == 0) {
        count = 0;
    } else {
        String document = JSON.toJSONString(aggregationResults.getMappedResults().get(0));
        JSONObject result = JSON.parseObject(document);
        count = result.getInteger(Constant.COUNT);
    }

    return count;
}

而且,我使用 java 程序在本地运行相同的代码。它也需要 5 秒。

我不知道为什么服务器需要这么多时间。

MongoDB配置:

MongoClientOptions.Builder builder = new xxx() 
builder.connectionsPerHost(100); 
builder.minConnectionsPerHost(10); 
builder.connectTimeout(30000); 
builder.threadsAllowedToBlockForConnectionMultiplier(10); 
builder.serverSelectionTimeout(30000); 
builder.socketTimeout(0); 
builder.maxWaitTime(120000); 
builder.heartbeatConnectTimeout(30000); 
builder.heartbeatSocketTimeout(30000);
builder.heartbeatFrequency(10000);
builder.minHeartbeatFrequency(500);
builder.localThreshold(15);

这是我的本地 Java 代码

public class Test {


    public static void main(String[] args) {
        // Link code omitted
        MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory);

        search(mongoTemplate);

        try {
            mongoDbFactory.destroy();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    public static void search(MongoTemplate mongoTemplate){
    
        Criteria criteria = Criteria.where("systemStatus").is(true);
        //criteria  code omitted, sane whit the server code 

        Aggregation typedAggregation1 = Aggregation.newAggregation(
                match(criteria),
                lookup,
                match(criteria4),
                Aggregation.count().as("count")
        );


        AggregationResults<BasicDBObject> aggregationResults = mongoTemplate.aggregate(typedAggregation1, User.class, BasicDBObject.class);

    }
}

java控制台

标签: mongodbspring-data-mongodb

解决方案


推荐阅读