2012-04-20 1 views
35

Come posso trovare tutti gli oggetti di un database con cui un campo di un oggetto contiene una stringa?Come trovare una sottostringa in un campo in MongoDB

Se il campo è un in un oggetto di una raccolta con un valore stringa:

voglio trovare tutti gli oggetti nel "database" db quando A contiene una stringa dire "abc def".

ho provato:

db.database.find({A: {$regex: '/^*(abc def)*$/''}}) 

ma non ha funzionato

UPDATE

Una stringa reale (in Unicode):

Sujet Commentaire sur Star Wars Episode III - La Revanche des Sith 1 

bisogno di cercare per tutti voci con Star Wars

db.test.find({A: {$regex: '^*(star wars)*$''}}) not wokring 
+1

Come @derick sottolinea, se vuoi cercare "qualsiasi stringa di caratteri", devi '. *': '.' per ogni carattere (singolo),' * 'per" la cosa precedente qualsiasi numero (incluso zero) volte. Il '(star wars) * $ 'si combina con" star warsstar warsstar wars "ma non" star wars è grandioso ". – drevicko

risposta

39

Invece di questo:

db.database.find({A: {$regex: '/^*(abc def)*$/''}}) 

Si dovrebbe fare questo:

db.database.find({A: /abc def/i }) 

^* non è in realtà la sintassi valida come^e $ sono ancore e non qualcosa che è ripetibile. Probabilmente intendevi ^. * Qui. Ma non c'è bisogno di ^. * Poiché ciò significa semplicemente "Tutto fino al carattere che segue" e (abc def) * significa "0 o più volte" abc def ", ma deve essere alla fine della stringa, a causa delle vostre $. la "i" alla fine è quello di rendere maiuscole e minuscole.

+2

nota che l'utilizzo di '^' aiuta a velocizzare query di espressioni regolari in quanto gli indici saranno efficaci solo in questa forma (vedere la parte inferiore della pagina a http://docs.mongodb.org/manual/reference/operator/regex/) –

+0

corretta me se sbaglio, ma "^ *" ha senso? Non dovrebbe essere "^. *"? Per me '^ *', si legge "zero o più inizi della linea", di cui v'è solo e sempre uno, e mi sembra che __doesn't__ consentire caratteri tra l'inizio della linea e il resto della regex ... – drevicko

+0

@drevicko, hai ragione. Era un errore di battitura nella mia risposta. L'ho chiarito. – Derick

16

basta usare la stringa di "Star Wars" e $regex farà il resto

db.test.find({A: {$regex: 'Star Wars'}})