0

私は MongoDB にたくさんのレコードを保存していますが、それらは (ほとんど) タイトルケースで書かれています。サンプルプロトタイプ:

{
   'name':'Awesome Pair of Jeans',
   'designer':'Company123',
   'description':'This pair of jeans is really great. Navy colour.'
},{
   'name':'awesome jeans part 2',
   'designer':'company123',
   'description':'This pair of jeans is also navy in colour.'
}

フロントエンド (Angular/Node 上に構築) で、ユーザーがレコードを検索できるようにしたいのですが、MongoDB の検索では大文字と小文字が区別されるため、いくつかの問題があります。

現在、誰かが「名前」フィールドで「awesome」(小文字)という単語を検索した場合、両方を確認して返される唯一の方法はawesomeAwesome次のようにクエリすることです。

まず、クエリが正規表現でラップされます。したがって、ユーザーが「awesome」を検索すると、次のようにクエリに渡されます。name:/awesome/i

exports.postsQuery = function(req,res){
    var query = req.params.query; // 'name:/awesome/i'
    var properties = query.split('+');
    var criteria = {};
    properties.forEach(function(property) {
        var propParts = property.split('=');
        criteria[propParts[0]] = eval(propParts[1]); // criteria{name:/awesome/i};
    });

    db.products.find(criteria, function (err, record) {
       // Do stuff
    });
}

これは正しい結果を返しますが、それがどれほど安全であるか、これを行うためのより良い方法があるかどうか疑問に思っています.

この質問に似ています: Mongoでの大文字と小文字を区別しない検索ですが、速度とセキュリティのベストプラクティスは何ですか.

4

1 に答える 1

1

文字列を構築する代わりに/awesome/i、おそらく渡しawesome、次に代わりに

criteria[propParts[0]] = eval(propParts[1])

できるよ

criteria[propParts[0]] = new RegExp(propParts[1], "i");

RegExp現在取得しているものと同じものを返しますが、eval文字列操作を使用したり使用したりすることはありません。

于 2013-07-10T16:26:49.297 に答える