5

2 つのイベントがあるとします。

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

そして、イベントを取得するための REST API を作成しています。この API は、オプションのパラメーター を受け取ります。パラメーターがid存在する場合は、その ID に固有のイベントのみを返し、null の場合はすべてのイベントを返します。

したがって、 のみapi/events?id=1を返す必要がありますが、 との両方を返します。現在、if-else ステートメントを使用していますが、オプションのパラメーターが増えると、これは明らかにスケーラブルではありません。代わりにこれを MongoDB クエリとして表現する方法はありますか?event1api/eventsevent1event2

コード:

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

単一パラメータ

1 つのアイデアは、クエリ オブジェクトを三項演算子で設定することです。

次のようなもの:

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

複数のパラメータ

そうは言っても、クエリするパラメーターが複数ある場合、1 つの方法は、以下のような 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 ループに変換することは、あなたに任せます。

未知のパラメータ

パラメーターの数が事前にわからない場合、1 つのオプションは、文字列を作成してから JSON オブジェクトに変換することです。ただし、これはお勧めしません。ユーザーにパラメーターを定義させるのは危険です。

于 2013-10-25T03:08:12.577 に答える