簡體   English   中英

在查詢字符串中執行mongoose查詢

[英]perform a mongoose query in querystring

我正在嘗試使用查詢字符串進行簡單的mongoose查詢。 這有效

router.get('/', function(req,res) {
    myModel.find({name:"test e"}, function(err,data){
        if(err) console.log(err)
        res.json(data);
    });

});

這不起作用(我得到了整個系列)..

router.get('/', function(req,res) {
    console.log(req.query.q)
    myModel.find(req.query.q, function(err,data){
        if(err) console.log(err)
        res.json(data);
    });

});

有這個要求

/api/myModel?q={name:"test e"}

我不認為這是一個url編碼問題,因為我打印'q'var並且它看起來很好服務器端。

附帶問題:如果這不是標准模式,查詢數據庫的RESTful標准方法是什么?

編輯更多一般細節:我不需要通過ID或名稱進行簡單訪問,如Ashley B建議的,我需要一個適當的搜索引擎用於我的數據庫(用戶,使用圖形Web界面,必須能夠查詢每個字段另外,可能)

編輯2:感謝Blakes Seven我解決了我的初始問題,但如果您知道或使用更好的方法來執行復雜的查詢,我很樂意討論。 也許我應該公開其他資源“/ api / seach”?

我想我可以回答你的第二個問題(附帶問題)來回答你的第一個問題。

假設您有一個User模型,通常您有一個端點來獲取所有用戶,如下所示:

router.get('/users', function(req, res) {
    // find all users
    users.find({}, function(err, data){
        if(err) console.log(err)
        res.json(data);
    });
});

要查找特定用戶,您將擁有如下所示的端點:

router.get('/users/:name', function(req, res) {
    // get the user's name from the url and find that user
    users.find({name: req.params.name}, function(err, data){
        if(err) console.log(err)
        res.json(data);
    });
});

因此,您只需使用特定的部分,而不是通過查詢字符串傳遞整個查詢。 允許用戶使用自己的查詢直接訪問您的數據會使安全性變得更加困難。

我建議你使用一些庫來解析查詢字符串到mongoDB查詢。 它可以解決您的問題並使您的代碼更好。

querymen會通過將/myModel?q=test+e轉換為{name: 'test e'}來幫助您,讓您完全控制查詢字符串架構。

var querymen = require('querymen')

// querymen.middleware() defines an express middleware with querystring schema
router.get('/', querymen.middleware({
  q: {
    type: String,
    paths: ['name']
  }
}), function(req, res) {
  console.log(req.querymen.query) // {name: 'test e'}
  myModel.find(req.querymen.query, function(err,data){
    if(err) console.log(err)
    res.json(data);
  });
});

正確的查詢應如下所示:

/api/myModels?name=test%20e

myModals部分是復數形式。

在這里查看: 如何設計RESTful搜索/過濾?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM