Comment interroger un tableau [chaîne] pour un match regexp?
Question
je tente d'interroger MongoDB via casbah pour un champ qui est un tableau de chaînes avec une expression rationnelle.
Par exemple:
J'ai un Maschine avec une liste des adresses IP, qui sont stockés sous forme de chaîne dans les champs ips. Maintenant, je veux rechercher toutes les machines qui ont le sous-réseau 192.168.
Pour moi, je ressemble à ce que je ne peux pas l'interroger un tableau avec une expression rationnelle appliquée à chaque entrée et si l'une des entrées correspond à la machine est retournée.
Toute façon de faire requête un tel?
- Correction
Merci pour votre aide.
Tout fonctionne maintenant. A la fin je dois travailler autour d'une limitation de la casbah, parce que je devais joindre aux questions avec $ ou et la kasbah se plaint de manquer implicits avec le regexp.
Mon code final pour une requête Array RegExp avec un autre champ supplémentaire est:
val regexp = ".*" + parameter + ".*"
val nameQ = MongoDBObject("serverName" -> regexp.r)
val ipsQ = MongoDBObject("ips" -> regexp.r)
val bldr = MongoDBList.newBuilder
bldr += ipsQ
bldr += nameQ
val query = MongoDBObject("$or" -> bldr.result.asDBObject)
val result = find(query)
Il est pas le code plus belle et la concaténation de chaîne des besoins des paramètres à fixer. Mais cela fonctionne :)
La solution
Vous pouvez ignorer le fait que ce soit un tableau:
> db.rx.insert( { "ips" : ["192.168.1.231", "192.168.2.231", "120.32.42.51"] });
> db.rx.find( { ips : /192./ } )
{ "_id" : ObjectId("4f104f0183bfca7a48b60da1"),
"ips" : [ "192.168.1.231", "192.168.2.231", "120.32.42.51" ] }
MongoDB se comporte toujours comme ça. Si vous traitez un tableau comme un champ normal, il appliquera l'opération à chaque membre et, si l'on matches, considérer le document parent un match
Autres conseils
Voir si la $elemMatch
requête opérateur fonctionnera pour vous.