2016-09-30 114 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