5

假设我有两个事件:

{"id":1, "name":"event1"},
{"id":2, "name":"event2"}

我正在编写一个 REST API 来检索事件。此 API 采用可选参数 ,id如果存在,则仅返回特定于该 id 的事件,如果为 null,则返回所有事件。

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

代码:

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,
        org_id = (_get.org_id) ? parseInt(_get.org_id) : "";

    if (org_id == "") {
        eventCollection.find({

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

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

4

1 回答 1

11

单参数

一种想法是使用三元运算符设置查询对象。

类似于以下内容:

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 对象。但是,我不建议这样做。让用户定义参数是很危险的。

于 2013-10-25T03:08:12.577 回答