Je souhaite rechercher dans mon dépôt utilisateur une chaîne de requête.
Cela devrait renvoyer tous les utilisateurs avec un nom d'utilisateur similaire "kyogron" et un courrier électronique similaire "kyogron @ gmail"
GET localhost:3000/users?username=kyogron&[email protected]
Cela devrait renvoyer tous les utilisateurs:
GET localhost:3000/users
J'ai déjà réussi à gérer les paramètres de routage, mais je suis coincé pour l'optimiser:
app.get('/users', function(req, res) { // creates a mongoosejs query object var query = User.find({}); // to understand how expressjs handles queries: // ?username=kyogron&[email protected] // { username: "kyogron", email: "[email protected]" } //console.log(req.query); // this was one idea of optimizing the search query parameters // this doesn't work don't know why I always get an array of ALL users // even the key and value is right Object.keys(req.query).forEach(function(key) { query.select(key, req.query[key]); }); // this was the way I was first handling the parameters, this works !! //if (req.query.username) query.where('username', req.query.username); //if (req.query.email) query.where('email', req.query.email); // the rest of the query query.select('username', 'email'); query.exec(function(err, users) { if (err) throw err; res.json(users); }); });
Voici les problèmes avec lesquels je meurs:
Serais bien si quelqu'un pourrait m'aider 🙂
Cordialement
EDIT :
La deuxième question serait résolue avec $ où:
if (req.query.username) { query.$where(function() { return this.username === req.query.username; // here we need a regex check }); }
Cela ne fonctionne pas … Quelqu'un pourrait-il me donner un indice?
EDIT2:
Je n'ai rien réussi avec $ où … mais j'ai maintenant trouvé
query.where('username').regex();
Je dois juste chercher une regex de recherche qui recherche des mots similaires
EDIT3:
J'ai trouvé ce fil: Comment interroger MongoDB avec "like"? Je demande au groupe de mangous comment je pourrais le faire avec la mangouste
EDIT4:
if (req.query.username) { query.where('username').regex(new RegExp("\/"+req.query.username+"\/")); }
Je l'ai presque compris. Il suffit de réparer cette stupide regex …
app.get('/users', function(req, res) { var query = User.find({}); Object.keys(req.query).forEach(function(key) { query.where(key).regex(new RegExp(req.query[key])); }); /* if (req.query.username) { query.where('username').regex(new RegExp(req.query.username)); } if (req.query.email) { query.where('email').regex(new RegExp(req.query.email)); }*/ query.select('username', 'email'); query.exec(function(err, users) { if (err) throw err; res.json(users); }); });
Le premier n'a pas fonctionné parce que j'avais une faute de frappe (.select () not .where ()). La seconde a été trouvée dans un fil supplémentaire
Je suis encore un peu incertain quant à l'approche choisie.
Iterating req.query permettrait de rendre le code réutilisable (peut-être comme fonction de paramètre de routage de précondition) mais il est tout à fait susceptible d'erreurs