Chcete-li najít prostřednictvím slova, všechny produkty, které existují v kolekci, obsahují toto slovo do pole popisu, potřebujete shodu regulárního výrazu s nerozlišováním malých a velkých písmen. Můžete použít následující dotaz (jako příklad):
db.product.find({"data.description": /test/i});
kde i
v /test/i
označuje nerozlišování malých a velkých písmen, takže regulární výraz se shoduje v poli popisu pro jakýkoli text s řetězcem "test"
. Následuje ekvivalentní SQL výraz:
select * from product where description like '%test%'
Totéž byste tedy mohli použít ve své implementaci trasy pomocí find()
metoda pro vrácení všech odpovídajících dokumentů namísto findOne()
který vrátí pouze 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);
});
});
Další možností je použít $text
operátor ve vaší operaci hledání, když provádí textové vyhledávání v obsahu polí indexovaných pomocí textového indexu. Takže první věc, kterou byste udělali, je vytvořit textový index v poli popisu:
db.collection.createIndex( { "data.description": "text" } )
Poté můžete dotazovat pomocí operátoru $text. Například následující dotaz hledá výraz káva:
db.collection.find( { $text: { $search: "coffee" } } )
UPRAVIT :
Pokud jsou všechny věci stejné, můžete aktualizovat implementaci trasy tak, aby místo toho používala v adrese URL řetězce dotazu:
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);
});
});
který můžete v prohlížeči zadat jako http://localhost/description?q=product