Pour trouver à travers un mot, tous les produits qui existent dans la collection incluent dans le champ de description ce mot, vous avez besoin d'une correspondance regex avec insensibilité à la casse. Vous pouvez utiliser la requête suivante (par exemple) :
db.product.find({"data.description": /test/i});
où le i
dans le /test/i
indique l'insensibilité à la casse, ainsi l'expression régulière correspond au champ de description pour tout texte avec la chaîne "test"
. L'expression SQL équivalente suit :
select * from product where description like '%test%'
Vous pouvez donc utiliser la même chose dans votre implémentation de route, en utilisant le find()
méthode pour renvoyer tous les documents correspondants au lieu de findOne()
qui renvoie un seul document :
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);
});
});
Une autre option consiste à utiliser le $text
opérateur dans votre opération de recherche car il effectue une recherche de texte sur le contenu des champs indexés avec un index de texte. La première chose à faire est donc de créer un index de texte sur le champ de description :
db.collection.createIndex( { "data.description": "text" } )
Après cela, vous pouvez interroger à l'aide de l'opérateur $text. Par exemple, la requête suivante recherche le terme café :
db.collection.find( { $text: { $search: "coffee" } } )
MODIFIER :
Toutes choses étant égales par ailleurs, vous pouvez ensuite mettre à jour l'implémentation de votre route pour utiliser à la place des chaînes de requête dans l'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 vous pouvez interroger dans votre navigateur en tant que http://localhost/description?q=product