我想使用查询字符串搜索我的用户存储库。
这应该返回具有相似用户名“kyogron”和相似电子邮件“kyogron@gmail”的所有用户
GET localhost:3000/users?username=kyogron&email=kyogron@gmail.com
这应该返回所有用户:
GET localhost:3000/users
我已经设法处理了路由参数,但我还在优化它:
app.get('/users', function(req, res) {
// creates a mongoosejs query object
var query = User.find({});
// to understand how expressjs handles queries:
// ?username=kyogron&email=kyogron@gmail.com
// { username: "kyogron", email: "kyogron@gmail.com" }
//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);
});
});
这些是我正在解决的问题:
- 为什么迭代 req.query 对象不起作用?
- 如何说 mongoose 以使用通配符(例如 kyo*)
如果有人能帮助我,那就太好了:)
问候
编辑:
第二个问题可以用 $where 解决:
if (req.query.username) {
query.$where(function() {
return this.username === req.query.username; // here we need a regex check
});
}
这些不起作用...有人可以给我提示吗?
编辑 2:
没有用 $where 管理任何东西......但是我现在找到了
query.where('username').regex();
我只需要寻找一个搜索相似词的正则表达式
编辑 3:
我找到了这个线程:How to query MongoDB with "like"?我在 mongoosejs 组中询问如何使用 mongoose 执行此操作
编辑4:
if (req.query.username) {
query.where('username').regex(new RegExp("\/"+req.query.username+"\/"));
}
我差一点就明白了。只需修复这个愚蠢的正则表达式...
最佳答案
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);
});
});
第一个没有用,因为我打错了(.select() 而不是 .where())。第二个是在一个额外的线程中找到的
我对所选择的方法仍然有点不确定。
迭代 req.query 将使代码可重用(可能作为路由参数函数的前提条件)但它很容易出错
关于javascript - Expressjs : Search query api,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11609697/