【问题标题】:Form &lt and &gt query for mongoose表单 &lt 和 &gt 查询 mongoose
【发布时间】:2017-02-08 17:51:17
【问题描述】:

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

例如:http://localhost:8080/api/products?price=>100&price=

我已经编写了下面的代码来获取所有产品。

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}]},我会得到想要的结果。

如何动态形成查询?

【问题讨论】:

  • 将您的 URL 参数重命名为 minPricemaxPrice,其余的将就位。

标签: node.js mongodb api mongoose


【解决方案1】:

把你的网址改成

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

【讨论】:

  • 如何根据传递的参数动态生成查询?传递的参数可能因用户选择的过滤器而异。我提供的 URL 只是参数的一个示例。
【解决方案2】:

您可以首先重新定义查询参数以遵循此模式:

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 对象是否不为空并在您的 find() 查询中使用它,前提是参数与架构中的字段完全匹配。对于这个给定的场景,下面的例子将展示直觉:

获取

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

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

【讨论】:

  • 如何根据传递的参数动态生成查询?传递的参数可能因用户选择的过滤器而异。我提供的 URL 只是参数的一个示例。
  • req.query 对象已经为您生成了查询对象,您需要对其进行预处理以满足您的条件需求,例如参数中的值默认为字符串,因此您需要解析它们为整数,以便它们适用于您的查询,否则在查询中使用 req.query 对象将不会产生所需的结果。
【解决方案3】:

您应该更新您的查询链接,例如:

 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){ 
   //.....
}

【讨论】:

  • 如何根据传递的参数动态生成查询?传递的参数可能因用户选择的过滤器而异。我提供的 URL 只是参数的一个示例。
猜你喜欢
  • 2011-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-11
  • 1970-01-01
  • 2011-05-11
  • 2017-01-19
相关资源
最近更新 更多