2016-10-25 8 views
1

私はMongooseを使ってMongodbデータベースを検索しています。クライアント側では、私が持っている:サーバー側でMongoose検索クエリ

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に3番目の選択肢はありますか?

答えて

0

ない第3の選択肢、あなたはクライアント側での正規表現を定義する必要があります:

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