2012-01-13 9 views
8

intento consultar MongoDB a través de Casbah para un campo que es una matriz de cadenas con una expresión regular.¿Cómo consultar una matriz [String] para una coincidencia de expresiones regulares?

Por ejemplo:

Tengo un Maschine con una lista de IPs, que se almacena en forma de cadena en los campos ips. Ahora quiero buscar todas las máquinas que tienen la subred 192.168.

Para mí me parece que no se puede consultar una matriz con una expresión regular aplicada a cada entrada y si una de las entradas coincide con la máquina se devuelve.

¿Alguna forma de realizar una consulta?

- Corregido

Gracias por su ayuda.

Todo funciona ahora. Al final, tengo que trabajar en torno a una limitación de Casbah, porque necesitaba unirme a las consultas con $ oy Casbah se queja de las implícitas faltantes con la expresión regular.

Mi código final para una consulta RegExp matriz con 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 tiene que ser fijo. Pero funciona :)

Respuesta

12

Puede pasar por alto 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 de esta manera: si el tratamiento de una gran variedad al igual que un campo normal, se aplicará la operación para cada miembro y, si uno coincide, considere que el documento principal coincide.

0

Vea si el $elemMatch query operator funcionará para usted.

+0

Lo intenté ya. $ elemMatch espera que mi matriz tenga pares clave/valor. Pero solo tengo cuerdas simples. – Odo

Cuestiones relacionadas