形式<和>查询猫鼬

时间:2016-09-30 08:07:48

标签: node.js mongodb api mongoose

我正在尝试编写一个节点API,它会根据API调用中传递的过滤器来获取产品列表。

例如:http://localhost:8080/api/products?price=> 100& price =< 200& 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}]}用于上面给出的例子,我会得到所需的结果。

如何动态地形成查询?

3 个答案:

答案 0 :(得分:0)

您可以从重新定义查询参数开始,以遵循以下模式:

CREATE TRIGGER adjust_start_date_trigger
   AFTER INSERT
   ON shows
   FOR EACH ROW
   EXECUTE PROCEDURE adjust_start_date(); 

在路由器中,api/products?min=100&max=200&colour=red 会产生

req.query

将查询中的参数用作:

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

动态生成查询取决于许多因素。首先,如果查询只涉及搜索匹配特定字段集的文档而这些字段是字符串类型,那么您只需要检查 查看req.query对象是否为空并在find()查询中使用它,前提是参数与模式中的字段完全匹配。对于这个给定的场景,以下示例将显示直觉:

获取

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会产生

api/products?name=foo&colour=red

然后您可以将其用作查询,例如

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

<强>路由器

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

如果您有一些范围查询,那么您需要像在原始答案中一样预处理查询对象。

答案 1 :(得分: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){ 
   //.....
}

答案 2 :(得分: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) {
    })