2017-01-29 39 views
0

當我嘗試使用大於或小於mongoDB where子句時,出現以下錯誤:任何想法如何避免這種情況?

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

下面是我的全部Groovy代碼至今: 一切正常,除了大於(或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 !!! 

回答

1

你應該避免:

  • 參考JMeter的變量如使用$var結構

${var}

  • ,因爲他們在Groovy中特殊的意義,所以:

    1. 替換這些${serverIP}vars.get("serverIP")${mongodb}vars.get("mongodb")
    2. 替換單引號雙引號,尤其是在你使用$gt功能
    3. (可選)分號的線端的線是沒有必要的

    參考文獻:

  • 2

    錯誤消息:groovy.lang.MissingPropertyException,被拋出時, :

    動態屬性調度失敗並且出現 未知屬性時發生異常。

    注意:在失蹤*異常類被命名爲一致性,避免與同名的JDK例外衝突。

    將「age」作爲鍵和新的BasicDBObject(「$ gt」,30)作爲值插入的嘗試會導致出現異常,因爲JVM會尋找一個不存在的屬性調用gt 。

    put方法表示:在此對象中設置名稱/值對。 在代碼中,您打算附加搜索條件,而不是放在其中。

    相關的代碼你有,我會建議更換使用方法與追加

    這是你的代碼:

    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.where語法, 這是更具可讀性。

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

    另一個小問題,因爲你的代碼是用Groovy寫的,你不應該完成每一行;

    1

    你試過使用單引號,所以groovy不認爲你正在做字符串模板?

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