Para encontrar através de uma palavra, todos os produtos que existem na coleção incluem no campo de descrição essa palavra, você precisa de uma correspondência de regex com diferenciação de maiúsculas e minúsculas. Você pode usar a seguinte consulta (como exemplo):
db.product.find({"data.description": /test/i});
onde o
i
no /test/i
indica distinção entre maiúsculas e minúsculas, portanto, a regex corresponde ao campo de descrição para qualquer texto com a string "test"
. A expressão SQL equivalente segue:select * from product where description like '%test%'
Portanto, você pode usar o mesmo em sua implementação de rota, usando o
find()
método para retornar todos os documentos correspondentes em vez do findOne()
que retorna apenas um 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);
});
});
Outra opção é usar o
$text
operador em sua operação de localização, pois realiza uma pesquisa de texto no conteúdo dos campos indexados com um índice de texto. Então, a primeira coisa que você faria é criar um índice de texto no campo de descrição:db.collection.createIndex( { "data.description": "text" } )
Depois disso, você pode consultar usando o operador $text. Por exemplo, a consulta a seguir pesquisa o termo café:
db.collection.find( { $text: { $search: "coffee" } } )
EDITAR :
Todas as coisas sendo iguais, você pode atualizar sua implementação de rota para usar strings de consulta na 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);
});
});
que você pode consultar em seu navegador como
http://localhost/description?q=product