【问题标题】:Query MongoDB with Custom URL filters使用自定义 URL 过滤器查询 MongoDB
【发布时间】:2016-08-31 22:51:58
【问题描述】:

为各种不同的显示器创建 API。想检索数据库中的所有显示,然后传递自定义查询字符串,然后进一步过滤。整天都在研究如何做到这一点,但没有什么是完全有意义的,或者无法让它完全按预期工作。

示例 URL:localhost:3000/api/v1/displays?hdmi=true&hdmi_version=1.2。从理论上讲,这些自定义查询的范围可以来自所有不同的规范显示,包括不同的值(字符串、布尔值和整数)。

技术

  • 快递:4.13.4
  • 节点:5.6.0
  • MongoDB(本地):3.2.4
  • Angular:1.5,将是最终的前端,但只是尝试构建 API 并使用 POSTman

数据库:

[
  {
    "_id": "572be4122847a355994a07d9",
    "series": "meh-monitor",
    "hdmi": false,
    "hdmi_version": "",
    "vga": true,
    "resolution": "1366x768"
  },
  {
    "_id": "572be4122847a355994a07da",
    "series": "ok-monitor",
    "hdmi": true,
    "hdmi_version": "1.0",
    "vga": true,
    "resolution": "1920x1080"
  },
  {
    "_id": "572be4122847a355994a07db",
    "series": "good-monitor",
    "hdmi": true,
    "hdmi_version": "1.2",
    "vga": false,
    "resolution": "2560x1440"
  }
]

快递-server.js

var express = require('express');
var app = express();
var path = require('path');
var port = process.env.PORT || 3000;

var mongojs = require('mongojs');
var bodyParser = require('body-parser');
var db = mongojs('products', ['displays']);
var apiVersion = "v1";

所以我可以得到所有的显示:

app.get('/'+apiVersion+'/displays', function(req, res){
  db.displays.find(function(err,docs){
    if(err){
      res.send(err);
    }
    else{
      return res.json(docs);
    }
  });
});

或使用 id 参数获取特定显示:

// GET ONE ENTRY
app.get('/'+apiVersion+'/displays/:id', function(req,res){
  db.displays.findOne({_id:mongojs.ObjectID(req.params.id)},function(err,doc){
    if(err){
      res.send(err);
    }
    else{
      return res.json(doc);
    }
  });
});

问题只是传递自定义参数。尝试使用mongo-querystring 哪种有效,但无法通过hdmi_version=#.#resolution=####x#### 过滤。此外,文档示例对我来说并不完全清楚。

任何帮助将不胜感激。

【问题讨论】:

    标签: node.js mongodb rest express


    【解决方案1】:

    您可以通过 req.query.paramName 获取参数。如图查询db。

    所以,例如:localhost:3000/api/v1/displays?hdmi=true&hdmi_version=1.2&resolution=1920x1080

    由于URL参数,可能存在也可能不存在,你也得先检查一下。

    app.get('/'+apiVersion+'/displays', function(req,res){
    
      //To print the parameters
      console.log(req.query.hdmi);
      console.log(req.query.resolution);
    
      //Remember to sanitize the query before passing it to db
      var query = {};
      if (req.query.resolution) query.resolution = req.query.resolution;
      if (req.query.resolution) query.hdmi = req.query.hdmi;
    
      db.displays.find(query, function(err, displays){
        if (err) {
          res.send(err);
        }
        else {
          return res.json(displays);
        }
      });
    });
    

    【讨论】:

    • 感谢您让我指出正确的方向,这非常有帮助。注意到这不能正确解析布尔值。对于http//...?hdmi=true,它正在寻找字符串值{hdmi: 'true'},这是一个准确的假设吗?
    • 是的,因为它无法将任何数据类型与 url 参数区分开来。 var myBool = Boolean(param); 转换
    • 感谢您的澄清,有道理。再次感谢您的回答。
    猜你喜欢
    • 1970-01-01
    • 2010-10-14
    • 2021-03-19
    • 2021-05-17
    • 2016-09-11
    • 2020-08-15
    • 2019-11-24
    • 2017-09-05
    • 1970-01-01
    相关资源
    最近更新 更多