2017-05-23 11 views
1

私は3つの入力パラメータを指定できるAPIを構築しています: /trips/:id/:from/:toなどです。私が特に興味を持っているパラメータはfromtoです。私のMongoDBのコレクションでは、私は次のような構造を有する:reqパラメータに基づいてダイナミックに集約フィールドを追加します

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); 
    }); 
}); 

だから私の質問は、動的の入力に対応するプロジェクトのステージを作成するためのどのような良い習慣であり、どこから?

答えて

1

すべてがちょうど

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は常に暗黙的に指定されたJavaScriptオブジェクト平野です。


または範囲をループして

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; 
} 
+0

ニート、ありがとう!このようにすると、照らし込みをより簡単に行うことができます。 2ヶ月を超える連続した月が指定されている場合は、今すぐループが必要です。 – ffritz

+1

@ffritzそれだけで十分です。追加されました。 –

+0

ああ、それを期待していませんでしたが、自分の解決策に取り組んでいた。これはすばらしく見える!どうもありがとう。 – ffritz

関連する問題