Om door een woord heen te zoeken, bevatten alle producten die in de collectie bestaan in het beschrijvingsveld dat woord, je hebt een regex-overeenkomst nodig met hoofdletterongevoeligheid. U kunt de volgende zoekopdracht gebruiken (als voorbeeld):
db.product.find({"data.description": /test/i});
waar de i
in de /test/i
geeft niet-hoofdlettergevoeligheid aan, dus de regex komt overeen met het beschrijvingsveld voor elke tekst met de tekenreeks "test"
. De equivalente SQL-expressie volgt:
select * from product where description like '%test%'
Dus je zou hetzelfde kunnen gebruiken in je route-implementatie, met behulp van de find()
methode om alle overeenkomende documenten te retourneren in plaats van de findOne()
die slechts één document retourneert:
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);
});
});
Een andere optie is om de $text
operator in uw zoekbewerking omdat het een tekstzoekopdracht uitvoert op de inhoud van de velden die zijn geïndexeerd met een tekstindex. Dus het eerste dat u zou doen, is een tekstindex maken in het beschrijvingsveld:
db.collection.createIndex( { "data.description": "text" } )
Daarna kunt u een query uitvoeren met de $text-operator. De volgende zoekopdracht zoekt bijvoorbeeld naar de term koffie:
db.collection.find( { $text: { $search: "coffee" } } )
BEWERKEN :
Als alles gelijk is, kunt u uw route-implementatie bijwerken om in plaats daarvan queryreeksen in de URL te gebruiken:
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);
});
});
die u in uw browser kunt opvragen als http://localhost/description?q=product