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

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top