MongoDB查询的可选参数
假设我有两个事件:
{"id":1, "name":"event1"}, {"id":2, "name":"event2"}
我正在编写一个REST API来检索事件。 这个API接受一个可选的参数id
,如果存在的话,它只返回特定于该id的事件,如果返回null则返回所有的事件。
所以api/events?id=1
应该只返回event1
,而api/events
将同时返回event1
和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驱动程序。
单参数
一个想法是使用三元运算符设置查询对象。
像下面这样:
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 ); } }); });
多个参数
说了这么多,如果你有多个参数来查询,一种方法是build立一个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循环。
未知参数
如果您事先不知道参数的数量,则可以select一个选项来构build一个string,然后将其转换为JSON对象。 不过,我不推荐这个。 让用户定义参数是很危险的。