JMeter MongoDB Where子句不适用于$gt$lt



当我试图在mongoDB where子句中使用大于或小于时,我得到了以下错误:知道如何避免这种情况吗?

Response message: javax.script.ScriptException: groovy.lang.MissingPropertyException: No such property: gt for class: Script117

以下是我到目前为止的完整Groovy代码:除了GREATER THAN(或lt)查询过滤器:之外,其他一切都正常工作

import com.mongodb.DB;
import org.apache.jmeter.protocol.mongodb.config.MongoDBHolder;
import com.mongodb.MongoClient;
import com.mongodb.ServerAddress;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
import com.mongodb.DBCursor;
import com.mongodb.DBCollection;
import com.mongodb.*;
//======================================================================
MongoClient mongoClient = new MongoClient(new ServerAddress("${serverIP}", ${serverPort}));
DB db = mongoClient.getDB("${mongodb}");
DBCollection coll = db.getCollection("${collectionName}");
StringBuilder rs = new StringBuilder();
rs.append("Collection: n");
BasicDBObject allQuery = new BasicDBObject();
BasicDBObject fields = new BasicDBObject();
fields.put("name", 1);     //projected fields
fields.put("age", 1);      //projected fields
fields.put("eyeColor", 1); //projected fields
fields.put("balance", 1);  //projected fields
BasicDBObject whereQuery = new BasicDBObject();
//whereQuery.put("gender", "female");
whereQuery.put("age", new BasicDBObject("$gt", 30));
DBCursor cursor = coll.find(whereQuery, fields);
while( cursor.hasNext() )  {
DBObject obj = cursor.next();
rs.append(obj.toString());
rs.append("n");
}
rs.toString();
//String variable at the LAST LINE of this Groovy script will be displayed in Results tab, even if no Display methods are invoked !!!

错误消息:groovy.lang.MissingPropertyException,在以下情况下抛出:

动态属性调度失败时发生异常,返回未知属性。

注意丢失的*Exception类的命名是为了保持一致性,避免与JDK同名异常发生冲突。

尝试插入"age"作为键,插入新的BasicDBObject("$gt",30)作为值,会导致出现异常,因为JVM会查找不存在的名为gt的属性。

put方法的意思是:设置此对象中的名称/值对。在你的代码中,你打算附加搜索条件,而不是放它

与您的代码相关,我建议将put方法的使用替换为append

这是您的代码:

BasicDBObject whereQuery = new BasicDBObject();
//whereQuery.put("gender", "female");
whereQuery.put("age", new BasicDBObject("$gt", 30));

如果更换:

whereQuery.put("age", new BasicDBObject("$gt", 30));

带有:

whereQuery.append("age", new BasicDBObject("$gt", 30));

您可以使用的另一个建议是Criteria。其中语法,其可读性要高得多。

def query = Query.query(Criteria.where('gender').is('female').and('age')
.gt(30))
collection.find(query, fields)

另一个小问题是,因为您的代码是用Groovy编写的,所以不应该用它来完成每一行;

你有没有尝试过使用单引号,这样groovy就不会认为你在做字符串模板了?

whereQuery.put("age", new BasicDBObject('$gt', 30))
//                                      ^   ^ here

您应该避免:

  • 将JMeter变量引用为${var}
  • 使用$var结构

因为它们在Groovy中有特殊的含义,所以:

  1. vars.get("serverIP")替换这些${serverIP},用vars.get("mongodb")替换${mongodb},等等
  2. 用单引号替换双引号,尤其是在使用$gt函数的行中
  3. (可选)行末不需要分号

参考文献:

  • Groovy与Java的差异
  • 如何使用JMeter加载测试MongoDB