2016-10-25 184 views
1

我正在通過使用Mongoose的Mongodb數據庫執行搜索。在客戶端,我有:貓鼬搜索查詢

var searchQuery = { 
      title: ($('#responseTitle').val()), 
      text: ($('#responseKeywords').val()) 
     }; 

$.ajax({ 
     type: "GET", 
     url: "../../api/threads", 
     data: searchQuery, 
     success: function(data){ 
      prefetchedResponses = data; 
      loadResponseBrowser(); 
     } 
    }) 

在服務器端,我有:

router.get('/', function(req, res, next) { 
    Response.find(req.query, function(err, foundResponses){ 
    ... 

這工作,但只返回與精確匹配的字段。我想實現一個正則表達式類型的搜索。但是,我無法決定是在客戶端還是服務器端進行。在服務器端,它將涉及遍歷req.query的每個字段並附加必要的屬性以啓用正則表達式搜索。在客戶端,通過構建titletext來預先定義這些屬性,會更容易。但是,在客戶端做這件事對我來說似乎是錯誤的,因爲後端可能會隨時發生變化。

在Mongoose中是否有第三種選擇可以讓我將regex應用於所有領域?

回答

0

沒有第三種選擇,你必須定義在客戶端的正則表達式:

var searchQuery = { 
     title: {$regex: ($('#responseTitle').val()), $options: "i"}, 
     text: {$regex: ($('#responseKeywords').val()), $options: "i"} 
    }; 

或者在服務器端

for(var i in req.query) 
{ 
    req.query[i] = {$regex: req.query[i], $options: "i"}; 
} 
Response.find(req.query, .... 
0

您可以將正則表達式傳遞給貓鼬。這是很容易做到會做以下幾點:

router.get('/', function(req, res, next) { 

    var regexQuery = { 
     title: new RegExp(req.query.title, 'i') 
     text: new RegExp(req.query.text, 'i') 
    } 
    Response.find(regexQuery, function(err, foundResponses){ 
    ... 
+0

是的,我知道,但就像我說的,它涉及到迭代在每個領域 – db2791

0

使用POST方法而不是GET方法。

客戶端的JavaScript

var searchQuery = { 
    title: ($('#responseTitle').val()), 
    text: ($('#responseKeywords').val()) 
}; 

$.ajax({ 
    type: "POST", 
    url: "../../api/threads", 
    data: searchQuery, 
    success: function(data) { 
     prefetchedResponses = data; 
     loadResponseBrowser(); 
    } 
}) 

服務器端JavaScript

router.post('/threads', function(req, res, next) { 
    var searchTitle = req.body.title; 
    var searchText = req.body.text; 
    var regexValue1 = '^' + searchTitle; 
    var regexValue2 = '^' + searchText; 
    var queryOptions = { 
     $and: [{ 
      searchTitle: { 
       '$regex': regexValue1, 
       '$options': 'i' 
      } 
     }, { 
      text: { 
       '$regex': regexValue2, 
       '$options': 'i' 
      } 
     }] 
    } 
    var promise = Response.find(queryOptions); 
    promise.then(function(data) { 
     if (data) { 
      return res.status(200).json(data); 
     } else { 
      return res.status(422).json('No data') 
     } 
    }); 
    promise.catch(function(error) { 
     return res.status(500).json(error); 
    }); 
});