2012-07-23 62 views
5

我想用查询字符串搜索我的用户存储库。Expressjs:搜索查询api

这将返回所有用户都具有相似的用户名“kyogron”以及类似的电子邮件“kyogron @ gmail的”

GET localhost:3000/users?username=kyogron&[email protected] 

这将返回所有用户:

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 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); 
    }); 

}); 

这些是p roblems我与之战斗:

  1. 为什么不迭代req.query对象工作?
  2. 我怎么说猫鼬使用通配符(如:京*)

将是很好,如果有人可以帮助我:)

问候

编辑

第二个问题可以用$解决:其中:

if (req.query.username) { 
     query.$where(function() { 
      return this.username === req.query.username; // here we need a regex check 
     }); 
    } 

Thos不起作用...有人可以给我一个提示吗?

EDIT2:

没有管理与$什么地方......但我现在发现

query.where('username').regex(); 

我只是要寻找一个搜索正则表达式,看起来类似的话

编辑3:

我发现此线程:How to query MongoDB with "like"?我的mongoosejs组问我怎么能做到这一点与猫鼬

EDIT4:

if (req.query.username) { 
      query.where('username').regex(new RegExp("\/"+req.query.username+"\/")); 
} 

我几乎得到了它。只要有解决这个愚蠢的正则表达式...

回答

1
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); 
    }); 

}); 

第一个没有工作,因为我有一个错字(。选择()不是。凡())。第二个被发现在一个额外的线程

我仍然有点不确定所选择的方法。

迭代req.query将允许代码重用(可能作为预置路由参数 - 函数),但它很容易出错