Aby znaleźć poprzez słowo, wszystkie produkty, które istnieją w kolekcji, zawierają w polu opisu to słowo, potrzebujesz dopasowania wyrażenia regularnego bez rozróżniania wielkości liter. Możesz użyć następującego zapytania (jako przykładu):
db.product.find({"data.description": /test/i});
gdzie i
w /test/i
wskazuje niewrażliwość na wielkość liter, dlatego wyrażenie regularne pasuje do pola opisu dla dowolnego tekstu z ciągiem "test"
. Odpowiednie wyrażenie SQL jest następujące:
select * from product where description like '%test%'
Możesz więc użyć tego samego w implementacji trasy, używając find()
metoda zwracania wszystkich dopasowanych dokumentów zamiast findOne()
który zwraca tylko jeden dokument:
app.get("/description/:id", auth, function(req, res, next) {
req.collection.find({
"data.description": /req.params.id/i
}, function(e, result) {
if(e) return next(e);
res.send(result);
});
});
Inną opcją jest użycie $text
operatora w operacji wyszukiwania, ponieważ wykonuje ona wyszukiwanie tekstowe w zawartości pól zindeksowanych indeksem tekstowym. Więc pierwszą rzeczą, którą powinieneś zrobić, to utworzyć indeks tekstowy w polu opisu:
db.collection.createIndex( { "data.description": "text" } )
Następnie możesz wykonać zapytanie używając operatora $text. Na przykład poniższe zapytanie wyszukuje termin kawa:
db.collection.find( { $text: { $search: "coffee" } } )
EDYTUJ :
Jeśli wszystkie rzeczy są równe, możesz zaktualizować implementację trasy, aby zamiast tego używała ciągów zapytań w adresie URL:
app.get("/description", auth, function(req, res, next) {
req.collection.find({
$text: { $search: req.params.q }
}, function(e, result) {
if(e) return next(e);
res.send(result);
});
});
które możesz wyszukać w przeglądarce jako http://localhost/description?q=product