是否可以将groupProperty与mongoDB和Grails一起使用?

时间:2016-11-18 10:17:19

标签: mongodb grails

我正在尝试在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的插件页面不允许我查看旧版本。非常令人沮丧。

1 个答案:

答案 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