在JMeter中执行Mongodb聚合

在JMeter中执行Mongodb聚合,mongodb,groovy,jmeter,aggregate,mongodb-java,Mongodb,Groovy,Jmeter,Aggregate,Mongodb Java,我试图使用mongo java驱动程序3.8在JMeter中运行一个简单的聚合。我不熟悉JMeter,不熟悉将Mongo与Java结合使用。我使用本教程作为起点: 我修改了查询文档部分中用于JSR223采样器的代码,如下所示: import org.bson.Document; import org.bson.types.ObjectId; import com.mongodb.client.model.Aggregates; try { MongoCollection<Do

我试图使用mongo java驱动程序3.8在JMeter中运行一个简单的聚合。我不熟悉JMeter,不熟悉将Mongo与Java结合使用。我使用本教程作为起点:

我修改了查询文档部分中用于JSR223采样器的代码,如下所示:

import org.bson.Document;
import org.bson.types.ObjectId;

import com.mongodb.client.model.Aggregates;

try {
    MongoCollection<Document> collection = vars.getObject("collection");

    Document result = collection.aggregate(Arrays.asList(Aggregates.sample(1)));

    vars.put("exampleDocumentId", result.get("_id").toString());

    return "Document with id=" + result.get("_id") + " found";
}
catch (Exception e) {
    SampleResult.setSuccessful(false);
    SampleResult.setResponseCode("500");
    SampleResult.setResponseMessage("Exception: " + e);
}

请注意错误中的以下部分:无法投射对象

该方法返回。
文档
更改为
可聚合
将解决此问题。

请注意错误部分,其中指出:无法投射对象

该方法返回。 将
文档
更改为
可聚合
将解决此问题

  • 如前所述,请阅读文档:

  • 您不需要块,也不使用forEach(printBlock);在您的汇总报表末尾;而是使用first(),就像上面提到的教程在find语句中使用的一样

  • 如果你是一个新手(像我一样),只要使用文档中建议的餐厅数据,就可以了解它的工作原理

  • 下面是一个工作示例:

    import com.mongodb.client.MongoClients;
    import com.mongodb.client.MongoClient;
    import com.mongodb.client.MongoCollection;
    import com.mongodb.client.MongoDatabase;
    import com.mongodb.client.model.Aggregates;
    import com.mongodb.client.model.Accumulators;
    import com.mongodb.client.model.Projections;
    import com.mongodb.client.model.Filters;
    
    import org.bson.Document;
    
    try {
    
        MongoClient mongoClient = MongoClients.create();
        MongoDatabase database = mongoClient.getDatabase("test");
        MongoCollection<Document> collection = database.getCollection("restaurants");
    
        Document result = collection.aggregate(Arrays.asList(Aggregates.sample(1))).first()
    
        vars.put("exampleDocumentId", result.get("_id").toString());
    
        return "Document with id=" + result.get("_id") + " found";
    }
    catch (Exception e) {
        SampleResult.setSuccessful(false);
        SampleResult.setResponseCode("500");
        SampleResult.setResponseMessage("Exception: " + e);
    }
    
    导入com.mongodb.client.MongoClients;
    导入com.mongodb.client.MongoClient;
    导入com.mongodb.client.MongoCollection;
    导入com.mongodb.client.MongoDatabase;
    导入com.mongodb.client.model.Aggregates;
    导入com.mongodb.client.model.累加器;
    导入com.mongodb.client.model.Projections;
    导入com.mongodb.client.model.Filters;
    导入org.bson.Document;
    试一试{
    MongoClient MongoClient=MongoClients.create();
    MongoDatabase=mongoClient.getDatabase(“测试”);
    MongoCollection collection=database.getCollection(“餐厅”);
    文档结果=collection.aggregate(Arrays.asList(Aggregates.sample(1))).first()
    vars.put(“exampleDocumentId”,result.get(“_id”).toString();
    返回“documentwithid=“+result.get”(“\u id”)+“found”;
    }
    捕获(例外e){
    SampleResult.setSuccessful(假);
    采样器结果设置响应代码(“500”);
    SampleResult.setResponseMessage(“异常:+e”);
    }
    
  • 如前所述,请阅读文档:

  • 您不需要块,也不使用forEach(printBlock);在您的汇总报表末尾;而是使用first(),就像上面提到的教程在find语句中使用的一样

  • 如果你是一个新手(像我一样),只要使用文档中建议的餐厅数据,就可以了解它的工作原理

  • 下面是一个工作示例:

    import com.mongodb.client.MongoClients;
    import com.mongodb.client.MongoClient;
    import com.mongodb.client.MongoCollection;
    import com.mongodb.client.MongoDatabase;
    import com.mongodb.client.model.Aggregates;
    import com.mongodb.client.model.Accumulators;
    import com.mongodb.client.model.Projections;
    import com.mongodb.client.model.Filters;
    
    import org.bson.Document;
    
    try {
    
        MongoClient mongoClient = MongoClients.create();
        MongoDatabase database = mongoClient.getDatabase("test");
        MongoCollection<Document> collection = database.getCollection("restaurants");
    
        Document result = collection.aggregate(Arrays.asList(Aggregates.sample(1))).first()
    
        vars.put("exampleDocumentId", result.get("_id").toString());
    
        return "Document with id=" + result.get("_id") + " found";
    }
    catch (Exception e) {
        SampleResult.setSuccessful(false);
        SampleResult.setResponseCode("500");
        SampleResult.setResponseMessage("Exception: " + e);
    }
    
    导入com.mongodb.client.MongoClients;
    导入com.mongodb.client.MongoClient;
    导入com.mongodb.client.MongoCollection;
    导入com.mongodb.client.MongoDatabase;
    导入com.mongodb.client.model.Aggregates;
    导入com.mongodb.client.model.累加器;
    导入com.mongodb.client.model.Projections;
    导入com.mongodb.client.model.Filters;
    导入org.bson.Document;
    试一试{
    MongoClient MongoClient=MongoClients.create();
    MongoDatabase=mongoClient.getDatabase(“测试”);
    MongoCollection collection=database.getCollection(“餐厅”);
    文档结果=collection.aggregate(Arrays.asList(Aggregates.sample(1))).first()
    vars.put(“exampleDocumentId”,result.get(“_id”).toString();
    返回“documentwithid=“+result.get”(“\u id”)+“found”;
    }
    捕获(例外e){
    SampleResult.setSuccessful(假);
    采样器结果设置响应代码(“500”);
    SampleResult.setResponseMessage(“异常:+e”);
    }
    
    Collection.aggregate()函数调用返回的值不能直接转换到文档,您可以使用它从Iterable实例返回第一个值,如:

    Document result = collection.aggregate(Arrays.asList(Aggregates.sample(1))).head()
    
    有关JMeter中Groovy脚本的详细信息:

    Collection.aggregate()函数调用返回的值不能直接转换到文档,您可以使用它从Iterable实例返回第一个值,如:

    Document result = collection.aggregate(Arrays.asList(Aggregates.sample(1))).head()
    

    关于JMeter中Groovy脚本的更多信息:

    I替换为:Document result=collection.aggregate(Arrays.asList(Aggregates.sample(1));其中:AggregateIterable结果=collection.aggregate(Arrays.asList(Aggregates.sample(1));现在我得到了错误:响应消息:javax.script.ScriptException:org.codehaus.groovy.control.multiplecompilentErrorsException:startup failed:Script38.groovy:10:无法解析第10行第30列的类AggregateIterable。AggregateTable结果=collection.aggregate(Arrays.asList(Aggregates.sample(1))^您正在添加导入吗<代码>导入com.mongodb.client.aggregateItable我现在有:import com.mongodb.client.AggregateIterable;并导入com.mongodb.client.model.Aggregates;新的错误是:响应消息:异常:groovy.lang.MissingMethodException:没有方法签名:com.mongodb.client.internal.AggregateTableImpl.get()适用于参数类型:(java.lang.String)值:[u id]可能的解决方案:getAt(java.lang.String)、grep()、grep(java.lang.Object)、getAt(int)、wait()、any()请阅读文档!我替换了:documentresult=collection.aggregate(Arrays.asList(Aggregates.sample(1));其中:AggregateIterable结果=collection.aggregate(Arrays.asList(Aggregates.sample(1));现在我得到了错误:响应消息:javax.script.ScriptException:org.codehaus.groovy.control.multiplecompilentErrorsException:startup failed:Script38.groovy:10:无法解析第10行第30列的类AggregateIterable。AggregateTable结果=collection.aggregate(Arrays.asList(Aggregates.sample(1))^您正在添加导入吗<代码>导入com.mongodb.client.aggregateItable我现在有:import com.mongodb.client.AggregateIterable;并导入com.mongodb.client.model.Aggregates;新的错误是:响应消息:Exception:groovy.lang.MissingMethodException:没有方法的签名:com.mongodb.client.internal.AggregateIter