我正在尝试在Grails项目中将groupProperty与MongoDB一起使用。我使用的是Grails的2.3.2版本和MongoDB插件的3.0.1版本。
我的标准如下:
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的文档建议现在使用。
我的标准有问题吗?如果是插件版本问题,是否有人知道Grails MongoDB插件何时支持groupProperty?
我真的很难找到有关以前版本的Grails插件的文档 - 我错过了什么吗?据我所知,https://www.grails.org/plugin/mongodb的插件页面不允许我查看旧版本。非常令人沮丧。
答案 0 :(得分:2)
您应该使用“mongo的本机”查询语法来执行此类任务。
根据我的经验,GORM for mongo适用于简单的动态查找器,它在任何数据库上都以相同的方式工作,但是如果您需要触发特定于数据库的查询,则必须将其作为本机,GORM criteria
太偏向于SQL了。
因此,您的查询可能类似于:
def groupedScenarios = Scenario.collection.aggregate(
[ $group:[ _id:'_id', maxNumber:[ $max:scenarioNumber ] ] ]
).results()
我不是mongo专家,所以你必须自己组装一个正确的查询,按照mongo ref doc