MongoDB查询的可选参数

假设我有两个事件:

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

我正在编写一个REST API来检索事件。 这个API接受一个可选的参数id ,如果存在的话,它只返回特定于该id的事件,如果返回null则返回所有的事件。

所以api/events?id=1应该只返回event1 ,而api/events将同时返回event1event2 。 目前我正在使用一个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对象。 不过,我不推荐这个。 让用户定义参数是很危险的。