我正在构建一个可以指定3个输入参数的API,例如:
/trips/:id/:from/:to
。我特别感兴趣的参数是from
和to
。在我的mongoDB集合中,我有如下结构:
id 2014_08 2014_09 ...
1 [...] [...]
2 [...] [...]
现在,我希望在以下聚合中实现的是,根据from
和to
中的调用请求,它应该返回相应的字段。
例如:GET /trips/1/2014_08/2014_09
应返回:
id: 1,
2014_08: {
...
},
2014_09: {
...
}
我的路线如下:
app.get('/trips/:id/:from/:to', function(req,res) {
var aggr = Trip.aggregate([
{ "$match": {
"_id": Number(req.params.id)
}
},{
"$project": {
"_id" : 1,
"trips_201408": "$2014_08",
//How to append more to this, according to from/to?
}
}
])
aggr.options = { allowDiskUse: true };
aggr.exec(function(err, trips){
if(err)
res.send(err);
res.json(trips);
});
});
所以我的问题是,创建项目阶段的动态对应于from和to的输入有什么好的做法?
答案 0 :(得分:1)
一切都只是一个普通的JavaScript对象
var project = { };
project['trips_' + req.params.from] = 1;
project['trips_' + req.params.to] = 1;
var aggr = Trip.aggregate([
{ "$match": { "_id": Number(req.params.id) } },
{ "$project": project }
])
同样隐含_id
。
或循环范围:
var from = new Date(req.params.from.split('_').join('-')+'-01');
var to = new Date(req.params.to.split('_').join('-')+'-01');
var project = { };
for ( var d = from; d <= to; d.setMonth(d.getMonth() + 1) ) {
project['trips_' + d.getUTCFullYear() + '_' +
( (d.getUTCMonth() + 1 < 10)
? '0' + (d.getUTCMonth() + 1)
: (d.getUTCMonth() + 1) )] = 1;
}