У меня есть следующий код в контроллере 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 не работает?
Вы пробовали $ {fieldSelect}: true или $ {fieldSelect} .toString(): true? –
Да, я пробовал оба. Первые результаты в стеке, показанные выше. Второй ничего не возвращает. –