2012-03-30 7 views
13

Dokumentacja Mongoid daje tylko jeden przykład robi wieloznaczny wyszukiwania:W jaki sposób przeprowadzasz wieloznaczne wyszukiwanie Mongoid w środowisku Ruby on Rails?

Person.where(first_name: /^d/i) 

to wyszukuje wszystkie osoby z pierwszej nazwie zaczynającej się na „d”.

Co oznaczają modele /^ i /i?

Jak znaleźć wszystkich ludzi z imieniem i literą "na" w środku napisu? Np. Zapytanie to znajdzie "jonathan", ponieważ "na" jest podciągiem całego łańcucha.

Czy istnieje strona internetowa lub przewodnik zawierający te informacje?

Odpowiedz

34

Potrzebujesz tego, aby znaleźć osoby z "na" w nazwie.

Person.where(first_name: /na/i) 

Jak dla przykładu:

Person.where(first_name: /^d/i) 

^ oznacza "początek wiersza". To wyrażenie dopasuje wszystkie ciągi, w których pierwsza litera to "d". /i oznacza "nie uwzględniaj wielkości liter". Więc pasuje zarówno do "d", jak i "D".

Uwaga: tylko przedrostki przedrostkowe (z ^ z przodu) są w stanie korzystać z indeksów. Jest to my favourite.

+3

+1 pod linkiem do Rubular.com – Joe

+0

Czy można wykonać zapytanie takie jak 'Person.where (first_name:/na/i)' jeśli pole 'first_name' ma typ' Mongoid :: EncryptedString'. Używam mongoid 3.1.6 i otrzymuję * TypeError: no niejawną konwersję Regexp na String *. –

4

To nie jest wyszukiwanie "wieloznaczne", to się nazywa wyrażenie regularne.

/^d/i 
  • Dwa ukośniki są tylko regex ograniczniki, szukać tego, co jest między tymi dwoma kreskami ukośnymi.
  • Następujący i jest modyfikatorem lub opcją. Zmienia to zachowanie pasujące do wyrażenia regularnego, a oznaczenie i oznacza wielkość liter, co oznacza, że ​​pasuje do "d" i "D".
  • Pierwszy znak ^ jest kotwica, to zakotwicza wzorzec wyszukiwania na początku łańcucha, czyli mecz „D” tylko na początku łańcucha

Dobry tutorial na temat wyrażeń regularnych jest tutorial on regular-expressions.info

Jeśli chcesz wyszukać ciąg w dowolnym miejscu ciągu, po prostu usuń kotwicę, która wiąże wzór na początku, /na/ znajdzie "na" w dowolnym miejscu ciągu.