For at finde gennem et ord, inkluderer alle de produkter, der findes i samlingen, det ord i beskrivelsesfeltet, du skal bruge et regex-match med ufølsomhed for store og små bogstaver. Du kan bruge følgende forespørgsel (som et eksempel):
db.product.find({"data.description": /test/i});
hvor i
i /test/i
angiver ufølsomhed for store og små bogstaver, så det regex matcher i beskrivelsesfeltet for enhver tekst med strengen "test"
. Det tilsvarende SQL-udtryk følger:
select * from product where description like '%test%'
Så du kan bruge det samme i din ruteimplementering ved at bruge find()
metode til at returnere alle matchede dokumenter i stedet for findOne()
som kun returnerer ét 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);
});
});
En anden mulighed er at bruge $text
operatoren i din søgeoperation, da den udfører en tekstsøgning på indholdet af de felter, der er indekseret med et tekstindeks. Så den første ting du ville gøre er at oprette et tekstindeks i beskrivelsesfeltet:
db.collection.createIndex( { "data.description": "text" } )
Derefter kan du forespørge ved hjælp af $text-operatoren. For eksempel søger følgende forespørgsel efter termen kaffe:
db.collection.find( { $text: { $search: "coffee" } } )
REDIGER :
Alt andet lige kan du derefter opdatere din ruteimplementering til i stedet at bruge forespørgselsstrenge i URL'en:
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 forespørge i din browser som http://localhost/description?q=product