2013-07-10 28 views
0

我有很多記錄存儲在MongoDB中,它們(大部分)都是用標題大寫的。樣品原型:搜索MongoDB時不區分大小寫 - 是eval()好嗎?

{ 
    '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.' 
} 

在我的前端(建立在角/節點),我想給用戶搜索記錄的能力,但MongoDB的搜索是區分大小寫的,我有一些問題。

目前,如果有人搜索在「名稱」框中輸入單詞「真棒」(小寫),只有這樣,我已經能夠保證雙方返回awesomeAwesome是查詢如下:

首先,查詢包裝在正則表達式中。因此,如果對「真棒」的用戶搜索,它傳遞給查詢作爲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 
    }); 
} 

這將返回正確的結果,但我不知道它是多麼的安全,以及是否有更好的方法來做到這一點。

與此問題類似:Case insensitive search in Mongo但我想知道什麼是速度和安全性的最佳實踐。

回答

1

相反建設/awesome/i字符串,它可能更好地傳承awesome然後代替

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

你可以做

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

這將返回相同的RegExp你目前正在獲取,但不使用eval並使用較少的字符串操作。

+0

好主意,歡呼! – Jascination