2012-01-13 11 views
8

provo a interrogare MongoDB via Casbah per un campo che è una matrice di stringhe con un'espressione regolare.Come eseguire una query su una [stringa] array per una corrispondenza regexp?

Ad esempio:

Ho un Maschine con un elenco di IP, che vengono memorizzati come stringa nei campi ips. Ora voglio cercare tutte le macchine che hanno la subnet 192.168.

Per me sembra che non possa eseguire una query su un array con un'espressione regolare applicata a ogni voce e se una delle voci corrisponde alla macchina viene restituita.

Un modo per fare una richiesta del genere?

- Fisso

Grazie per il vostro aiuto.

Tutto funziona ora. Alla fine ho bisogno di aggirare una limitazione di Casbah, perché avevo bisogno di unirmi alle query con $ o e Casbah si lamenta delle implicite mancanti con le espressioni regolari.

mio codice finale per una query RegExp Array con un altro campo aggiuntivo è:

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) 

Non è il codice migliori e la concatenazione di stringa del parametro deve essere risolto. Ma funziona :)

risposta

12

È possibile ignorare il fatto che questo è un array:

> 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 si comporta sempre così: se si trattano una matrice proprio come un campo normale, si applicherà l'operazione per ciascun membro e, se una corrispondenza, considera una corrispondenza il documento principale.

0

Vedere se il $elemMatch query operator funzionerà per voi.

+0

L'ho provato già. $ elemMatch si aspetta che il mio array abbia coppie chiave/valore. Ma ho solo semplici stringhe. – Odo