根据 req 参数动态地将字段添加到猫鼬聚合中



我正在构建一个 API,其中可以指定 3 个输入参数,例如: /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 的输入相对应的项目阶段的好做法是什么?

一切都只是一个普通的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;
}

最新更新