0

期待される結果を返す Grails コントローラーに次のコードがあります。

def alm = SiteHistory.collection.find([
   "phoneNumber":"${params.phoneNumber}",
   "fields.P2Running":true])
   .limit(20).toArray()

ただし、入力パラメーターに基づいて検索を変更したいと思います。次のクエリは、params.alarm == "P2Running" の場合、ドキュメントを返しません。

def fieldsSelect = "fields."+params.alarm
def alm = SiteHistory.collection.find([
   "phoneNumber":"${params.phoneNumber}",
   fieldSelect:true])
   .limit(20).toArray()

私も試しました:

def fieldsSelect = "fields."+params.alarm
def alm = SiteHistory.collection.find([
   "phoneNumber":"${params.phoneNumber}",
   "${fieldSelect}":true])
   .limit(20).toArray()

利回り

Message: org.codehaus.groovy.runtime.GStringImpl cannot be cast to java.lang.String
    at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:134)
    at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:86)
    at com.mongodb.DefaultDBEncoder.writeObject(DefaultDBEncoder.java:27)
    at com.mongodb.OutMessage.putObject(OutMessage.java:142)
    at com.mongodb.OutMessage._appendQuery(OutMessage.java:85)
    at com.mongodb.OutMessage.query(OutMessage.java:44)
    at com.mongodb.OutMessage.query(OutMessage.java:38)
    at com.mongodb.DBApiLayer$MyCollection.__find(DBApiLayer.java:303)
    at com.mongodb.DBCursor._check(DBCursor.java:369)
    at com.mongodb.DBCursor._hasNext(DBCursor.java:498)
    at com.mongodb.DBCursor._fill(DBCursor.java:558)
    at com.mongodb.DBCursor.toArray(DBCursor.java:596)
    at com.mongodb.DBCursor.toArray(DBCursor.java:584)
    at remote.SiteHistoryController$_closure2$$EO0HJb0Z.doCall(SiteHistoryController.groovy:58)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)

私のドメインオブジェクトは

class SiteHistory {
    ObjectId id
    String phoneNumber
    Date receiveDate=null
    Map<String,Object> fields = [:]
    static mapWith = "mongo"
}

フィールドの文字列キーは、データが追加されるまでわかりません。

サンプル ドキュメントは次のとおりです。

{
    "_id" : ObjectId("513eaefe290b3700b8e2c966"),
    "phoneNumber" : "1234567890",
    "receiveDate" : "Wed Mar 06 2013 23:52:47 GMT-0500 (EST)",
    "fields" : {
            "P1Runtime" : 37.6,
            "P1Starts" : 23,
            "P1Running" : false,
            "P2Runtime" : 35.7,
            "P2Starts" : 25,
            "P2Running" : true,
            "WetWellLvl" : 10,
            "HighLvlAlarm" : false
    }
}

params から作成された文字列が機能しない理由はありますか?

4

1 に答える 1

0

Grails 2.0.1 および Mongodb 1.0.0.RC4 で動作するコードは次のとおりです。

def query = new BasicDBObject("phoneNumber", params.phoneNumber)
    .append("fields.${params.alarm}", true)

def alm = SiteHistory.collection.find(query).limit(20).toArray()        

mongodbオブジェクトでは機能しないことをどこかで読んだので、基準を使用しようとしませんでした。ただし、このオブジェクトで動作しているnamedQueriesがあります。だから私は基準を試してみました。(注: Grails 2.2.1 および mongodb 1.2.0 で動作します。)

コードは次のとおりです。

def c = SiteHistory.createCriteria()
def alm = c.list (max:20, offset:0) {
    eq ("phoneNumber", params.phoneNumber)
    eq ("fields.${params.alarm}", true)
}

Grails 2.2.1 には他にも問題があるため、まだアップグレードしません。

于 2013-03-19T23:54:21.593 に答える