2017-05-23 1 views
1

Ich erstelle eine API, wo 3 Eingabeparameter angegeben werden können, wie zum Beispiel: /trips/:id/:from/:to. Die Parameter, die mich interessieren, sind from und to. In meiner mongoDB Sammlung, ich habe eine Struktur wie folgt aus:Hinzufügen von Feldern zur Mungo-Aggregation dynamisch basierend auf req params

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

Nun, was ich in der folgenden Aggregation erreichen wollen, ist, dass auf das, was aus dem Aufruf in from angefordert und to, sollte es kehrt die entsprechende Felder.

Zum Beispiel: GET /trips/1/2014_08/2014_09 sollte zurückgeben:

id: 1, 
2014_08: { 
    ... 
}, 
2014_09: { 
    ... 
} 

wie Meine Route aussieht:

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

ist also meine Frage, was für eine gute Praxis der Projektphasen dynamisch entsprechend den Eingang für die Erstellung von von und zu?

Antwort

1

Alles ist nur eine einfache JavaScript-Objekt

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

Auch die _id immer impliziert.


Oder mit Looping einen Bereich:

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

Ordentlich, danke! Auf diese Weise wird die Abfrage viel einfacher. Brauche jetzt eine Schleife, wenn mehr als 2 aufeinanderfolgende Monate angegeben sind. – ffritz

+1

@ffritz Sicher. Das ist einfach genug. Hinzugefügt. –

+0

Oh schön, habe das nicht erwartet, sondern an meiner eigenen Lösung gearbeitet. Das sieht gut aus! Danke vielmals. – ffritz

Verwandte Themen