【问题标题】:perform a mongoose query in querystring在查询字符串中执行猫鼬查询
【发布时间】:2016-06-03 05:45:13
【问题描述】:

我正在尝试使用查询字符串进行简单的猫鼬查询。 这行得通

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 标准方式是什么?

编辑以获取更多一般细节: 我不需要像 Ashley B 建议的那样通过 id 或名称进行简单访问,我需要为我的数据库提供适当的搜索引擎(用户使用图形 Web 界面必须能够单独查询每个字段,可能)

编辑 2: 感谢布莱克斯七号,我解决了我最初的问题,但如果你知道或使用更好的方法来执行复杂的查询,我很乐意讨论。 也许我应该公开另一个资源“/api/seach”?

【问题讨论】:

  • 对不起,我将跳过回答猫鼬相关部分,因为我没有使用过那个数据库。但是现在有一个标准,您可以在处理基于 json 的资源时遵循 jsonapi specification
  • 你的标题说明了一切。这是一个“字符串”。查询不应该是“字符串”,而是“对象”。所以JSON.parse(req.query.q) 使它成为一个对象。但是,直接从 URL 允许它可能并不是一个好主意。您的问题中还有一个错字,其中发出的查询应该是{ "name": "test e"},带有冒号:,而不是等于=
  • 是的,我忘记了“名称”上的引号,仅此而已,谢谢。

标签: node.js mongodb express mongoose


【解决方案1】:

我想我可以通过回答您的第二个问题(附带问题)来回答您的第一个问题。

假设你有一个用户模型,通常你会有一个端点来获取所有用户,如下所示:

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

因此,您无需通过查询字符串传递整个查询,而是找到使用特定部分。允许用户使用他们自己的查询直接访问您的数据会使保护变得更加困难。

【讨论】:

    【解决方案2】:

    我建议您使用一些库来将查询字符串解析为 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);
      });
    });
    

    【讨论】:

      【解决方案3】:

      正确的查询应该如下所示:

      /api/myModels?name=test%20e
      

      myModals 部分是复数形式。

      在这里查看:How to design RESTful search/filtering?

      【讨论】:

      • 由于在我的情况下查询可以计算约 30 个值,我更喜欢整个 json 查询的单个查询字符串参数和分页、限制、偏移量、顺序的其他参数。你怎么看?
      • 在这种情况下,您可以使用类似 jQuery.param()、qs library 或编写自己的函数来实现它。
      猜你喜欢
      • 2012-09-30
      • 2022-12-05
      • 1970-01-01
      • 2015-04-10
      • 2019-01-17
      • 2020-06-02
      • 2012-02-03
      • 2017-05-08
      • 2017-04-15
      相关资源
      最近更新 更多