2013-08-15 1 views
0

У меня есть серия тегов для объекта, и я бы хотел запросить объекты, содержащие все теги, переданные как массив. Я знаю, что операторы in и inList переводят на $ в operator в MongoDB, но $ in возвратит любой объект, содержащий хотя бы один из предоставленных тегов. Я хочу объекты, содержащие все предоставленные теги. Или сказал другой способ $ в методах findAll с t1 или t2 или t3 и т. Д. Я хочу findAll теги с t1 И t2 и t3 и т. Д. Mongodb, к счастью, поддерживает оператор $ all для этого.

Как я могу выполнить запрос из плагина GORM MongoDB от Grail, который будет использовать оператор $ all? Должен ли я использовать API низкого уровня? Если да, то каким образом я могу получить API нижнего уровня для возврата полностью заполненных объектов домена?

Или есть лучший вариант для запроса, чем использовать оператор $ all, который имеет лучшую производительность, и давайте останемся в рамках запросов GORM?

+0

Я боюсь, что вам придется использовать API низкого уровня, я не вижу ничего в [MongoQuery] (https://github.com/SpringSource/grails-data-mapping/blob/master/grails-datastore -mongo/src/main/groovy/org/grails/datastore/mapping/mongo/query/MongoQuery.java), обращаясь к '$ all'. – dmahapatro

+0

Есть ли лучшая документация, показывающая примеры использования API нижнего уровня и как отображать API нижнего уровня в объекты домена? Есть ли альтернативный запрос, который я мог бы использовать, чтобы получить тот же результат без использования оператора $ all? – chubbsondubs

+0

Вы можете сослаться на [docs from Mongodb GORM plugin] (http://springsource.github.io/grails-data-mapping/mongo/manual/guide/4.%20Low-level%20API.html), если у вас нет пока не встретишь. – dmahapatro

ответ

1

Хорошо, я чувствую, что делаю это примерно каждую пару недель, но здесь я документирую MongoDB GORM, так как авторы просто не считают это важным.

Итак, все не поддерживается. Альтернативный запрос заключается в следующем:

Photo.findAll { 
    and { 
     tagList.each { tag -> 
      eq('tags', tag) 
     } 
    } 
} 

Вы не можете использовать ==, но у меня нет объяснений. Кажется, я помню, что читал что-то о том, что каждое закрытие вмешивается, но я не могу найти его или не помню, где я его видел. В любом случае вам нужно использовать метод eq().