根据req参数动态添加字段到mongoose聚合

时间:2017-05-23 10:14:06

标签: javascript node.js mongodb mongoose

我正在构建一个可以指定3个输入参数的API,例如: /trips/:id/:from/:to。我特别感兴趣的参数是fromto。在我的mongoDB集合中,我有如下结构:

id    2014_08     2014_09     ...
1     [...]       [...]
2     [...]       [...]

现在,我希望在以下聚合中实现的是,根据fromto中的调用请求,它应该返回相应的字段。

例如: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的输入有什么好的做法?

1 个答案:

答案 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;
}