För att hitta genom ett ord, alla produkter som finns i samlingen inkluderar det ordet i beskrivningsfältet, du behöver en regexmatchning med skiftlägesokänslighet. Du kan använda följande fråga (som ett exempel):
db.product.find({"data.description": /test/i});
där i
i /test/i
indikerar skiftlägesokänslighet, därför matchar regexet i beskrivningsfältet för vilken text som helst med strängen "test"
. Det motsvarande SQL-uttrycket följer:
select * from product where description like '%test%'
Så du kan använda samma sak i din ruttimplementering med find()
metod för att returnera alla matchade dokument istället för findOne()
som bara returnerar ett 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);
});
});
Ett annat alternativ är att använda $text
operatorn i din sökoperation när den utför en textsökning på innehållet i fälten som indexeras med ett textindex. Så det första du skulle göra är att skapa ett textindex i beskrivningsfältet:
db.collection.createIndex( { "data.description": "text" } )
Efter det kan du fråga med operatorn $text. Följande fråga söker till exempel efter termen kaffe:
db.collection.find( { $text: { $search: "coffee" } } )
REDIGERA :
Allt annat lika kan du sedan uppdatera din ruttimplementering för att använda frågesträngar i URL:en istället:
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);
});
});
som du kan fråga i din webbläsare som http://localhost/description?q=product