使用自定义URL过滤器查询MongoDB

时间:2016-05-06 01:06:00

标签: node.js mongodb rest express

为各种不同的显示创建API。想要检索数据库中的所有显示,然后传递自定义查询字符串,然后进一步过滤。一整天都在研究如何做到这一点,没有任何事情已经完全有意义,或者无法完全按照预期的那样完成工作。

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

技术

  • Express: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####进行过滤。此外,文档示例对我来说还不是很清楚。

任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:1)

您可以通过req.query.paramName获取参数。如图所示查询数据库。

所以,对于像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);
    }
  });
});