0

我正在使用 nodeJS、MongoDB 和 Express 为 API (REST) 开发通用查询方法。

在将请求转发到我的模块之后,执行文字查询时一切都按预期工作。我正在通过示例进行查询,但是当我想使用正则表达式或 SQL 术语中的“like”进行查询时,我无法使其工作。

在模块中使用 express 的 find 方法是这样的:

exports.findByQuery = function(req, res) {
   collection.find( req.query).toArray(function(err, docs); 
}

这可以按预期工作,除了如果我想使用正则表达式查询字段以查找所有具有 T 的用户名,我总是将 .query JSON 对象作为带有“”的字符串获取,如下所示:

{"username":"/T/"}

代替 :

{username:/T/}

req.query 来自 GET 请求。

如果我更换:

 collection.find( req.query).toArray(function(err, docs);

和:

 collection.find( {username:/T/} ).toArray(function(err, docs);

它工作正常!..

我认为在对其执行 .find 之前,我需要对 req.query 执行清理或转换方法,但我找不到任何东西。任何线索或帮助将不胜感激!

在此先感谢您的帮助!

4

1 回答 1

0

我找到了解决方案。

如问题下方的评论中所述,我无法将对象直接转换为 RegExp。我所做的是创建一个辅助函数来为 mongo 返回格式正确的正则表达式查询,然后对其执行 .find 。

因此,发现将是:

exports.findByQuery = function(req, res) {
    var query = req.query;
    db.collection('users', function(err, collection) {
                collection.find( parseRegExpProperties(query) ).toArray(function(err, docs) {
            res.send(docs);
        });
    });
};

这是 : parseRegExpProperties 方法。我不知道这有多安全,但这至少对我来说是一个开始:

function parseRegExpProperties(obj) {
   var newObject = {};
   for(var propName in obj) {
      if(typeof(obj[propName]) != "undefined") {
        newObject[propName] = {'$regex': obj[propName], '$options': "i"};
      }
   }
   return newObject;
}

如果有人对性能有任何意见,或者这有多安全,将非常受欢迎!

于 2013-06-09T17:25:00.593 回答