2016-09-30 110 views
0

我正在嘗試編寫一個節點API,它將根據在API調用中傳遞的過濾器來獲取產品列表。Form&lt&gt查詢貓鼬

如:http://localhost:8080/api/products?price=> 100 &價格= 的color = red

我已經寫了下面的代碼來獲取所有的產品。

Product.find().populate("images", "image").exec(function(err, products){ 
    if(err){ 
     res.status(200); 
     return res.json({ 
      success: false, 
      message: err, 
     }); 
    }else{ 
     res.status(200); 
     return res.json({ 
      success: true, 
      message: 'Products fetched successfully', 
      data : products 
     }); 
    } 
}); 

我應該如何更改上述代碼以使用API​​調用中傳遞的任何過濾器?我知道如果我將{$and:[{price:{ $gt: 100, $lt: 200 }},{colour:red}]}作爲我給出的上述示例,我會得到期望的結果。

如何形成查詢動態?

+0

重命名你的URL參數'minPrice'和'maxPrice',其餘的將水到渠成。 – Tomalak

回答

0

您可以通過重新定義您的查詢參數遵循這個模式開始:

api/products?min=100&max=200&colour=red 

在你的路由器,req.query會產生

{ min: "100", max: "200", colour: "red" } 

使用參數查詢作爲:

app.get('/api/products', function(req, res) { 
    var query = { 
     "price": { 
      "$gt": parseInt(req.query.min), 
      "$lt": parseInt(req.query.max) 
     }, 
     "colour": req.query.colour 
    }; 

    Product.find(query).populate("images", "image").exec(callback); 
}); 

動態生成查詢將取決於許多因素。首先,如果查詢涉及的只是搜索匹配一組特定字段的文檔,並且這些字段是字符串類型,那麼您只需檢查 以查看req.query對象是否爲空,並在您的查找中使用它()查詢,條件是參數與模式中的字段完全匹配。對於這個給定的情況下,下面的例子將顯示直覺:

GET

api/products?name=foo&colour=red 

在你的路由器,req.query會產生

{ name: "foo", colour: "red" } 

然後您可以爲您的使用查詢例如:

Product.find({ name: "foo", colour: "red" }).populate(...).exec(callback) 

路由器

app.get('/api/products', function(req, res) { 
    var query = {}; 
    if (typeof req.query !== 'undefined' && req.query) query = req.query; 

    Product.find(query).populate("images", "image").exec(callback); 
}); 

在你有一定的範圍查詢,那麼你就需要預處理的查詢對象在原來的答覆事件。

+0

如何根據傳遞的參數動態生成查詢?傳遞的參數可以根據用戶選擇的過濾器而有所不同。我給出的URL只是參數的一個例子。 – Xylon

+0

'req.query'對象已經爲你生成了查詢對象,你需要預處理它來滿足你的條件需求,比如參數的值是默認的字符串,所以你需要將它們解析爲整數他們爲您的查詢工作,否則使用'req.query'對象,因爲它在您的查詢中將不會產生所需的結果。 – chridam

0

你應該更新喜歡你的查詢鏈接:

http://localhost:8080/api/products?minPrice=100&maxPrice=200&colour=red 

,然後生成在服務器端查詢像

var query = {}; 
    query = {$and:[ 
    {price:{ $gte: parseInt(req.query.minPrice)}}, 
    {price: {$lte: parseInt(req.query.maxPrice)}}, 
    {colour:req.query.colour}]}; 

Product.find(query).populate("images", "image").exec(function(err, products){ 
    //..... 
} 

更新時間:

,如果你在傳遞的url,查詢像上面那麼您可以根據傳遞的參數生成查詢。

var query = {}; 
if(req.query.colour) { 
    query.colour = req.query.colour 
} 
if(req.query.quantity) { 
    query.quantity= req.query.quantity 
} 
//... as you need 
// then 
Product.find(query).populate("images", "image").exec(function(err, products){ 
    //..... 
} 
+0

如何根據傳遞的參數動態生成查詢?傳遞的參數可以根據用戶選擇的過濾器而有所不同。我給出的URL只是參數的一個例子。 – Xylon

0

更改您的網址

http://localhost:8080/api/products?minPrice=100&maxPrice=200&colour=red 

和您的查詢就會

var query = { 
     "price": { 
      "$gt": parseInt(req.query.minPrice), 
      "$lt": parseInt(req.query.maxPrice) 
     }, 
     "colour": req.query.colour 
    }; 

    Product.find(query, function(err, result) { 
    }) 
+0

如何根據傳遞的參數動態生成查詢?傳遞的參數可以根據用戶選擇的過濾器而有所不同。我給出的URL只是參數的一個例子。 – Xylon