2013-08-15 5 views
0

J'ai une série de balises sur un objet, et je voudrais interroger les objets qui contiennent tous les balises passées en tableau. Je sais que les opérateurs in et inList traduisent en $ dans l'opérateur dans MongoDB, mais $ in retournera tout objet qui contient au moins une des balises fournies. Je veux des objets qui contiennent tous les tags fournis. Ou dit une autre façon $ dans les moyens findAll balises avec t1, ​​ou t2, ou t3, etc. Je veux trouver toutes les balises avec t1 et t2 ET t3, etc Mongodb supporte heureusement l'opérateur $ tout pour cela.

Alors, comment j'exécute une requête depuis le plugin GORM MongoDB de Grail qui utilisera l'opérateur $ all? Dois-je utiliser l'API de bas niveau? Si oui, comment puis-je obtenir l'API de niveau inférieur pour que les objets de mon domaine soient entièrement remplis?

Ou Y at-il une meilleure option pour interroger que d'utiliser l'opérateur $ all qui a de meilleures performances et laissez-moi rester dans les critères de requêtes de GORM?

+0

Je crains que vous deviez utiliser l'API de bas niveau, je ne vois pas quoi que ce soit dans [MongoQuery] (https://github.com/SpringSource/grails-data-mapping/blob/master/grails-datastore -mongo/src/main/groovy/org/grails/banque de données/mapping/mongo/query/MongoQuery.java) adressant '$ all'. – dmahapatro

+0

Existe-t-il une meilleure documentation montrant des exemples d'utilisation de l'API de niveau inférieur et comment mapper l'API de niveau inférieur aux objets Domaine? Y a-t-il une autre requête que je pourrais utiliser pour obtenir le même résultat sans utiliser $ tout l'opérateur? – chubbsondubs

+0

Vous pouvez vous référer à [docs du plugin Mongodb GORM] (http://springsource.github.io/grails-data-mapping/mongo/manual/guide/4.%20Low-level%20API.html), si vous ne l'avez pas le traverser encore. – dmahapatro

Répondre

1

Ok J'ai l'impression de faire ça à peu près toutes les deux semaines, mais ici je vais documenter MongoDB GORM puisque les auteurs ne le voient pas comme important.

Tout $ n'est pas supporté. Une requête alternative est la suivante:

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

Vous ne pouvez pas utiliser ==, mais je ne dispose pas d'une explication pour cela. Je pense que je me souviens d'avoir lu quelque chose à propos de l'interférence de chaque fermeture, mais je ne peux pas le trouver ou me souvenir où je l'ai vu. Quoi qu'il en soit, vous devez utiliser la méthode eq().