2016-05-06 7 views
0

さまざまな異なるディスプレイ用のAPIの作成。データベース内のすべてのディスプレイを取得し、カスタムクエリ文字列を渡してさらにフィルタリングしたいと考えています。これを行う方法について一日中研究しており、何も完全な意味を持たなかったか、それが期待どおりに完全に機能することができなかった。カスタムURLフィルタを使用したMongoDBのクエリ

サンプルURL:localhost:3000/api/v1/displays?hdmi=true&hdmi_version=1.2理論的には、これらのカスタムクエリは、異なる値(文字列、ブール値、および整数)を含む異なる仕様のディスプレイの範囲にある可能性があります。

テクノロジーズ

  • エクスプレス:4.13.4
  • ノード:5.6.0
  • MongoDBの(ローカル):3.2.4
  • 角度: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

req.query.paramNameからパラメータを取得できます。表示されているようにdbを照会します。

だから、のようなもののために:URLパラメータ以来localhost:3000/api/v1/displays?hdmi=true&hdmi_version=1.2&resolution=1920x1080

、またはあなたはまた、最初に確認する必要があり、存在しない可能性があります。

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

正しい方向を指摘してくれてありがとうございます。これは非常に役に立ちます。これはブール値を正しく解析しないことに気付きました。 'http // ...?hdmi = true'の文字列値' {hdmi: 'true'} 'を探しているのは、それが正確な仮定ですか? –

+0

はい。これは、任意のデータ型をURLパラメータから区別することができないためです。 'var myBool =ブール値(param);'変換する –

+0

わかりました。答えにもう一度感謝します。 –

関連する問題