当我试图在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中有特殊的含义,所以:
- 用
vars.get("serverIP")
替换这些${serverIP}
,用vars.get("mongodb")
替换${mongodb}
,等等 - 用单引号替换双引号,尤其是在使用
$gt
函数的行中 - (可选)行末不需要分号
参考文献:
- Groovy与Java的差异
- 如何使用JMeter加载测试MongoDB