¿Cómo consultar una matriz [cadena] para una coincidencia de regexp?
Pregunta
Trato de consultar MongoDB a través de Casbah para un campo que sea una variedad de cuerdas con una regexp.
Por ejemplo:
Tengo una mascina con una lista de IP, que se almacenan como cadena en los campos IPS. Ahora quiero buscar todas las máquinas que tengan la subred 192.168.
Para mí me parece a que no puedo consultar una matriz con una regexp aplicada a cada entrada y si una de las entradas coincide con la máquina se devuelve.
¿Alguna forma de hacer tal consulta?
-- Fijado
Gracias por tu ayuda.
Todo funciona ahora. Al final, necesito hacer una limitación de Casbah, porque necesitaba unirme a consultas con $ o y Casbah se queja de los implicados faltantes con el Regexp.
Mi código final para una consulta de matriz regexp con un otro campo adicional es:
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)
No es el código más bonito y la concatenación de cadena del parámetro debe solucionarse. Pero funciona :)
Solución
Puedes ignorar el hecho de que esta es una matriz:
> 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 siempre se comporta así: si trata una matriz como un campo normal, aplicará la operación a cada miembro y, si uno coincide, considere que el documento principal sea una coincidencia.
Otros consejos
Ver si el $elemMatch
operador de consultas funcionará para ti.