2012-11-30 16 views
7

Używam JavaScript do kwerendy API w oparciu o DB Mongo.MONGO DB Like Operator

musiałbym filtrować wyniki na podstawie LIKE operatora, czymś podobnym do

select * from playlist where title like '%a%' 

W tej chwili nazywamy ten URL

var assetUrl = 'https://example.com/playlist?oauth_token=' + accessToken + '&account=XXX'+ '&fields={"title":true,"splash":true,"description":true,"source":true}'+ '&criteria={"title":/.*a.*/}'; 

bez powodzenia return 0 (obiektów).

Chciałbym wiedzieć, czy zamiast tego powinienem używać wyrażeń regularnych i jak z nich korzystać w tym kontekście. Dzięki

Odpowiedz

18

Tak, MongoDB obsługuje wyrażenia regularne. Możesz przeczytać o tym w the documentation. Oto przykład:

db.collection.find({ url: /.*a.*/ }); 

Znajduje wszystkie dokumenty w kolekcji, w których pole "url" pasuje do wyrażenia regularnego. Istnieje również alternatywna składnia za pomocą operatora $ regex:

db.collection.find({ url: { $regex: ".*a.*"} }); 

Zwróć uwagę, że wyrażenia regularne są powolne i źle skalowane. Czas wyszukiwania jest liniowy do liczby rekordów w kolekcji, a indeksy pomagają tylko wtedy, gdy wyrażenie regularne zaczyna się od kotwicy rozpoczynającej ciąg ^ (dzięki, chx).

Dokumentacja ma również rozdział o numerze Full Text Search in Mongo, który zaleca podział każdego ciągu na tablicę pojedynczych słów, aby umożliwić indeksowanie w celu szybszego wyszukiwania. To oczywiście nie pozwala na wyszukiwanie fragmentów słów, ale znacznie przyspiesza wyszukiwanie pełnych słów.

Aktualizacja: MongoDB 2.4 ma a new experimental text-index feature który pozwala przyspieszyć wyszukiwanie text-z indeksami.

Update2: Począwszy od wersji 2.6, wyszukiwanie tekstu jest domyślnie włączony i gotowy do użytku produkcyjnego.

+2

Czasami wyrażenia regularne nie są powolne: „$ regex używa indeksów tylko wtedy, gdy wyrażenie regularne ma kotwicę na początku (tj ^) napisu”. http://docs.mongodb.org/manual/reference/operators/ – chx

+0

Dziękuję, @chx, Włączyłem te informacje do mojej odpowiedzi. – Philipp

0
var assetUrl = 'xxx.com/playlist?oauth_token=' + accessToken + '&account=xxx'+ '&fields='+escape('{"title":true,"splash":true,"description":true,"source":true}')+ '&criteria='+escape('{"title": {"$regex":".*ar.*"}}'); 

to rozwiązać mój problem

Powiązane problemy