Per trovare attraverso una parola, tutti i prodotti che esistono nella collezione includono nel campo della descrizione quella parola, è necessaria una corrispondenza regolare con insensibilità alle maiuscole e minuscole. Potresti usare la seguente query (come esempio):
db.product.find({"data.description": /test/i});
dove il i
nel /test/i
indica la distinzione tra maiuscole e minuscole, quindi la regex corrisponde nel campo della descrizione per qualsiasi testo con la stringa "test"
. Segue l'espressione SQL equivalente:
select * from product where description like '%test%'
Quindi potresti usare lo stesso nell'implementazione del tuo percorso, usando find()
metodo per restituire tutti i documenti corrispondenti invece di findOne()
che restituisce un solo documento:
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);
});
});
Un'altra opzione è usare $text
nell'operazione di ricerca in quanto esegue una ricerca di testo sul contenuto dei campi indicizzati con un indice di testo. Quindi la prima cosa che dovresti fare è creare un indice di testo nel campo della descrizione:
db.collection.createIndex( { "data.description": "text" } )
Dopodiché puoi interrogare usando l'operatore $text. Ad esempio, la query seguente cerca il termine caffè:
db.collection.find( { $text: { $search: "coffee" } } )
MODIFICA :
A parità di condizioni, puoi quindi aggiornare l'implementazione del percorso per utilizzare invece le stringhe di query nell'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);
});
});
che puoi interrogare nel tuo browser come http://localhost/description?q=product