1

如果设置了某些属性,我正在尝试从用户或其团队中获取所有活动,这些活动也按某些类型进行过滤。

这就是我现在所拥有的:

Activity.withCriteria{
    and{
        or {
            eq 'user',myUser
            "in" 'team',userTeams
        }
        and{
            if (showA || showB || showC){
                or{
                    if (showA){
                        "in" "a", myAList
                    }
                    if (showB){
                        "in" "b", myBList
                    }
                    if (showC){
                        "in" "c",myCList
                    }
                }
            }
        }
    }
    order "date","desc"
    maxResults maxElements
}

执行它,我得到的是用户和团队块的 OR 和 showA、showB、showC 块,而不是这两个块的 AND。

我正在使用 grails 2.2.1(也使用没有 Hibernate 的 MongoDB GORM 1.2.0)

编辑:

我已经能够看到发送到 MongoDB 的查询并且它没有执行标准的第一部分。这是传递给 MongoDB 的查询:

query: { query: { $or: [ { a: { $in: [ "5191e2c7c6c36183687df8b6", "5191e2c7c6c36183687df8b7", "5191e2c7c6c36183687df8b8" ] } }, { b: { $in: [ "5191e2c7c6c36183687df8b9", "5191e2c7c6c36183687df8ba", "5191e2c7c6c36183687df8bb" ] } }, { c: { $in: [ "5191e2c7c6c36183687df8b5" ] } } ] }, orderby: { date: -1 } }  ntoreturn: 10 ntoskip: 0

编辑:我刚刚看到已经提出了一个 JIRA,这似乎是一个 MongoDB 插件问题...... http://jira.grails.org/browse/GPMONGODB-296

4

2 回答 2

1

您可以从 SQL 角度考虑您的标准。

and ((user = 'myUserValue'
 or   team in (...))
and(a in (...)
  or b in (...)
  or c in (...)))

所以你or适用于userand team,但我认为你想要这样的东西:

or {
  and {
    eq 'user',myUser
    "in" 'team',userTeams
  }
  and{
    if (showA || showB || showC){
      or{
        if (showA){
          "in" "a", myAList
        }
        if (showB){
          "in" "b", myBList
        }
        if (showC){
          "in" "c",myCList
        }
      }
    }
  }
}

所以这里的关键是你声明的块被应用到你里面的东西上。

编辑

检查条件的一个好技巧是启用 Hibernate 生成的 sql 的输出。这可以在DataSource.groovy中完成

dataSource {
  logSql = true
}

hibernate {
  format_sql = true
}
于 2013-05-13T16:23:09.813 回答
0

在新版本的 Mongo for Grails 中,此问题已得到修复,因此现在可以使用 1.3.0 版本。

http://grails.org/plugin/mongodb

于 2013-10-15T06:20:20.497 回答