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 :)

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top