2012-04-20 11 views
35

Jak znaleźć wszystkie obiekty w bazie danych, gdzie pole obiektu zawiera podłańcuch?Jak znaleźć podciąg w polu w Mongodb

Jeśli pole jest A w obiekcie z kolekcji z wartości ciągu:

chcę znaleźć wszystkie obiekty w bazie danych „DB” gdzie A zawiera podciąg powiedzieć „abc def”.

Próbowałem:

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

ale nie działa

UPDATE

Prawdziwy ciąg (Unicode):

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

trzeba szukać wszystkich wpisy z Gwiezdnych wojen

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

Jako @derick zwraca uwagę, jeśli chcesz wyszukać "dowolny ciąg znaków", potrzebujesz '. *': '.' dla dowolnego (pojedynczego) znaku,' * 'dla" poprzedniej rzeczy dowolnej liczby (w tym zero) razy. '(Gwiezdne wojny) * $', które masz, pasowałyby do "star warsstar war war wars", ale nie "gwiezdne wojny są świetne". – drevicko

Odpowiedz

39

Zamiast tego:

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

Należy to zrobić:

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

^* w rzeczywistości nie jest prawidłowa składnia jak^i $ są kotwice i nie coś, co jest powtarzalne. Prawdopodobnie miałeś na myśli ^. * Tutaj. Ale nie ma potrzeby *. *, Ponieważ oznacza to po prostu "Wszystko do następnej postaci" i (abc def) * oznacza "0 lub więcej razy" abc def ", ale musi to być na końcu ciągu, z powodu twoich $. „ja” na końcu jest sprawienie, aby wielkość liter ma znaczenie.

+2

Należy zauważyć, że użycie "^" pomaga przyspieszyć zapytanie regex, ponieważ indeksy będą skuteczne tylko w tym formularzu (patrz u dołu strony pod adresem http://docs.mongodb.org/manual/reference/operator/regex/) –

+0

Popraw mnie, jeśli się mylę, ale czy "^ *" ma jakiś sens? Czy nie powinno to być "^. *"? Dla mnie "^ *" oznacza "zero lub więcej początków linii", z których jest tylko jeden i zawsze mi się to podoba __ nie pozwala na znaki między początkiem linii a resztą wyrażeń regularnych ... – drevicko

+0

@drevicko, masz rację. To była literówka w mojej odpowiedzi. Wyjaśniłem to. – Derick

16

Wystarczy użyć ciąg „Star Wars” i $regex zrobi resztę

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