2016-11-18 3 views
0

Я пытаюсь использовать groupProperty с MongoDB в проекте Grails. Я на версии 2.3.2 Grails и версии 3.0.1 плагина MongoDB.Можно ли использовать groupProperty с mongoDB и Grails?

Мои критерии выглядит следующим образом:

def groupedScenarios = Scenario.withCriteria { 
    eq 'scenarioVersion', { 
     projections { 
      max 'scenarioVersion' 
     } 
    } 
    projections { 
     groupProperty 'scenarioNumber' 
    } 
} 

Я пытаюсь найти сценарии, где scenarioVersion является самым высоким для данного scenarioNumber. Я даже не знаю, верны ли мои критерии, поэтому объяснение моей конечной цели.

Ошибка Возвращается

No signature of method: <my service>.groupProperty() is applicable for argument types: (java.lang.String) values: [scenarioNumber] 
Possible solutions: getProperty(java.lang.String), hasProperty(java.lang.String). Stacktrace follows: 
Message: No signature of method: <my service>.groupProperty() is applicable for argument types: (java.lang.String) values: [scenarioNumber] 
Possible solutions: getProperty(java.lang.String), hasProperty(java.lang.String) 

Некоторые поиск предложил groupProperty не был поддержан, но документы на 6-й версии плагина предложить сейчас.

Я делаю что-то не так с моими критериями? Если это проблема с версией плагина, знает ли кто-нибудь, когда groupProperty поддерживался плагином Grails MongoDB?

Я действительно пытался найти документацию о предыдущих версиях плагинов Grails - я что-то упустил? Плагин на странице https://www.grails.org/plugin/mongodb не позволяет мне смотреть старые версии, насколько я могу судить. Действительно расстраивает.

ответ

1

Для таких задач должен использоваться синтаксис запроса «mongo's native».

Из моего опыта GORM для mongo отлично подходит для простых динамических искателей, которые работают одинаково на любом DB, но если вам нужно запустить конкретный DB-запрос, вы должны пойти на родной язык, так как GORM criteria тоже SQL -biased.

Таким образом, вы запрос может выглядеть примерно так:

def groupedScenarios = Scenario.collection.aggregate(
    [ $group:[ _id:'_id', maxNumber:[ $max:scenarioNumber ] ] ] 
).results() 

Я не Монго-эксперт, так что вы должны собрать правильный запрос самостоятельно, так как на mongo ref doc

+0

не было точно, что Я был после, но ваш ответ показал мне свет, и я сделал то, чего я избегал целую вечность, и написал функцию mapreduce. Большое спасибо. –