Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript MongoDB查询的可选参数_Javascript_Node.js_Mongodb - Fatal编程技术网

Javascript MongoDB查询的可选参数

Javascript MongoDB查询的可选参数,javascript,node.js,mongodb,Javascript,Node.js,Mongodb,假设我有两件事: {"id":1, "name":"event1"}, {"id":2, "name":"event2"} 我正在编写一个RESTAPI来检索事件。此API采用一个可选参数,id,如果该参数存在,则仅返回特定于该id的事件,如果为空,则返回所有事件 因此api/events?id=1应该只返回event1,而api/events将同时返回event1和event2。目前我使用的是if-else语句,但是如果我有更多的可选参数,这显然是不可伸缩的。有没有办法将其表示为MongoD

假设我有两件事:

{"id":1, "name":"event1"},
{"id":2, "name":"event2"}
我正在编写一个RESTAPI来检索事件。此API采用一个可选参数,
id
,如果该参数存在,则仅返回特定于该id的事件,如果为空,则返回所有事件

因此
api/events?id=1
应该只返回
event1
,而
api/events
将同时返回
event1
event2
。目前我使用的是if-else语句,但是如果我有更多的可选参数,这显然是不可伸缩的。有没有办法将其表示为MongoDB查询

代码:

另外,我正在为MongoDB使用Node.js Javascript驱动程序。

单参数 一个想法是使用三元运算符设置查询对象

如下所示:

app.get('/api/events', function (req, res) {
    var _get = url.parse(req.url, true).query,
        eventCollection = db.collection('events');

    // Parameters passed in URL
    var page = (_get.page) ? _get.page * 10 : 0,
        query = (_get.org_id) ? {org_id:parseInt(_get.org_id)} : {};

    eventCollection.find(query, {limit: 10, skip: page}).toArray(function(err, events){
        if (!err) {
            res.json(
                events
            );
        }
    });
});
多参数 话虽如此,如果要查询多个参数,一种方法是构建一个JSON对象,如下所示:

app.get('/api/events', function (req, res) {
    var _get = url.parse(req.url, true).query,
        eventCollection = db.collection('events');

    // Parameters passed in URL
    var page = (_get.page) ? _get.page * 10 : 0,
    query = {};

    (_get.org_id) ? (query.org_id = parseInt(_get.org_id)) : "";
    (_get.name) ? (query.name = _get.name) : "";
    (_get.param3) ? (query.name = _get.param3) : "";

    eventCollection.find(query, {limit: 10, skip: page}).toArray(function(err, events){
        if (!err) {
            res.json(
                events
            );
        }
    });
});
我将留给您使用定义查询参数的块,并将其转换为for循环

未知参数
如果您事先不知道参数的数量,一个选项是构建一个字符串,然后将其转换为JSON对象但是,我不建议这样做。让用户定义参数是危险的。

有趣的想法!您将如何处理其他可选参数?e、 g.
/api/events?org_id=1和event_name=name等..
请参见对我的答案的编辑。您应该知道将要输入的(可接受的)参数数量和类型。
app.get('/api/events', function (req, res) {
    var _get = url.parse(req.url, true).query,
        eventCollection = db.collection('events');

    // Parameters passed in URL
    var page = (_get.page) ? _get.page * 10 : 0,
    query = {};

    (_get.org_id) ? (query.org_id = parseInt(_get.org_id)) : "";
    (_get.name) ? (query.name = _get.name) : "";
    (_get.param3) ? (query.name = _get.param3) : "";

    eventCollection.find(query, {limit: 10, skip: page}).toArray(function(err, events){
        if (!err) {
            res.json(
                events
            );
        }
    });
});