2013-04-15 16 views
8

Próbuję utworzyć zapytanie z tego, co użytkownik wyszukał. Mam tablicę ciągów, które po prostu chcę, aby wysłać poprzez w selektorze MongoDB, mój problem jest z/tekstu/składni, to działa doskonale z konsoli MongoDB jak ten:Meteor i mongoDB LIKE zapytanie

Items.find({ $or: [{name: /doc/}, {tags: /doc/}, {name: /test/}, {tags: /test/}] }); 

Ale nie uda się napisać tę samą składnię w javascript, próbowałem kilka wersji.

var mongoDbArr = []; 
    searchArray.forEach(function(text) { 
    mongoDbArr.push({name: /text/}); 
    mongoDbArr.push({tags: /text/}); 
    }); 
    return Items.find({ $or: mongoDbArr}); 

Ale wyszukuje tylko "tekst", a nie "whats" w zmiennej. I tak:

Ale to nie daje mi żadnych wyników. Czego mi brakuje?

+0

Czy używasz mongodb na serwerze lub minimongo na kliencie? (lub jedno i drugie?) – mquandalle

+0

W tej chwili oba. Próbuję tylko aplikacji z domyślnymi ustawieniami Meteor. – Snidd

Odpowiedz

18

Trzeba zbudować wyrażeń regularnych z javascript:

var mongoDbArr = []; 
searchArray.forEach(function(text) { 
    mongoDbArr.push({name: new RegExp(text)}); 
    mongoDbArr.push({tags: new RegExp(text,"i")}); 
}); 

return Items.find({ $or: mongoDbArr}); 

Albo użyć regular expressions frazę MongoDB:

mongoDbArr.push({name: { $regex : text, $options:"i" } }); 
mongoDbArr.push({tags: { $regex : text, $options:"i" } }); 

Aby uniknąć znaków specjalnych, możesz to zrobić przed użyciem text (ze źródła JQuery UI)

text = text.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&"); 
+0

Wyrażenie regularne działało na razie, martwię się tym, co dzieje się, gdy użytkownik wprowadza znaki zastrzeżone, co oznacza różne rzeczy w regex. – Snidd

+0

Ive zmodyfikował odpowiedź, aby uciec od znaków specjalnych. – Akshat

+0

Whoa. Czy oba te zapytania regex działają po stronie klienta? Łał. Tak. Umysł dmuchany. Umieszczenie tego w moim nowym pakiecie [autouzupełnianie Meteora] (https://github.com/mizzao/meteor-autocomplete) ... –

5

Spróbuj tego w funkcji publikowania na serwerze:

return YourCollection.find({'$or' : [ 
    { 'field1':{'$regex':searchString} }, 
    { 'field2':{'$regex':searchString} }, 
    { 'field3':{'$regex':searchString} }, ] 
}); 
+0

Ten pracował dla mnie. Dzięki! –