Динамические запросы MongoDb в Grails - PullRequest
1 голос
/ 01 февраля 2012

У меня есть домен, подобный этому в Grails

class User {
    static mapWith = "mongo"

    ObjectId id
    String name
    String address
    Integer age
}

Я создаю интерфейс поиска в Grails для запроса базы данных MongoDb с помощью плагина MongoDb .Поиск может быть выполнен по любому из полей в базе данных, и любое поле, не заданное пользователем, не должно использоваться в запросе.Т.е. никакие поля не должны сравниваться с нулем.Например, если оставить все поля пустыми, возвращаются все пользователи, но поиск name возвращает только те документы, которые соответствуют name.

Изначально мои запросы были простыми, и я использовал User.find(new User(params)); в своем контроллере, который работал нормально.Теперь мне нужно иметь возможность также запрашивать целочисленные поля, используя интервалы, больше и меньше, чем.Я смотрел на withCriteria() и строил запрос в зависимости от того, какие поля установил пользователь, но до сих пор мне не удавалось.

TL; DR Как я могу сделатьзапрос, где я не знаю, какие поля пользователь хочет включить в запрос?

1 Ответ

1 голос
/ 02 февраля 2012

Я решил это с помощью withCriteria() следующим образом:

def c = User.createCriteria()
def users = c.list {
    if(params.name)
        eq('name', params.name)
    if(params.address)
        eq('address', params.address)
    if(params.age_gt?.isInteger())
        gt('age', params.age_gt as Integer)
    if(params.age_lt?.isInteger())
        lt('age', params.age_lt as Integer)
}
...