Domanda

Cerco di interrogare MongoDB tramite Casbah per un campo che è una serie di stringhe con un regexp.

Per esempio:

Ho una maschina con un elenco di IP, che sono archiviati come stringa nei campi IP. Ora voglio cercare tutte le macchine con la sottorete 192.168.

Per me sembra che non posso interrogare un array con un regexp applicato a ogni voce e se una delle voci corrisponde alla macchina viene restituita.

Qualche modo per fare una domanda del genere?

-- Fisso

Grazie per l'aiuto.

Tutto funziona ora. Alla fine ho bisogno di aggirare una limitazione di Casbah, perché dovevo unirmi alle domande con $ o e Casbah si lamenta delle implicazioni mancanti con il regexp.

Il mio codice finale per una query di array regexp 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 più bello e la concatenazione stringa del parametro deve essere risolta. Ma funziona :)

È stato utile?

Soluzione

Puoi 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 in questo modo: se trattate un array proprio come un campo normale, applicherà l'operazione a ciascun membro e, se si corrisponde, considera il documento genitore una corrispondenza.

Altri suggerimenti

Vedere se il $elemMatch operatore di query funzionerà per te.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top