2013-03-16 2 views
0

У меня есть следующий код в контроллере Grails, который возвращает ожидаемый результат:Grails MongoDB находка не работает с точечной нотации, динамические атрибуты

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 не работает?

+0

Вы пробовали $ {fieldSelect}: true или $ {fieldSelect} .toString(): true? –

+0

Да, я пробовал оба. Первые результаты в стеке, показанные выше. Второй ничего не возвращает. –

ответ

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 так что я буду еще не обновление.

Смежные вопросы