2016-09-06 6 views
1

en php je le funnction global mongo suivant:php mongo projet global à champ Date

array(
    array(
     '$match' => array(
      "i" => array('$in' => $valRefId), 
      "date" => array('$gt'=> $mongotimestart , '$lte'=> $mongotimeend), 
     ), 
    ), 
    array(
     '$project' => array(
      "i" => '$i', 
      "v" => '$v', 
      "datumpje" => array('$add'=>array('$date',$timezone_date)), 
      "year" => array('$year' =>array('$add'=>array('$date',$timezone_date))), 
      "month" => array('$month'=>array('$add'=>array('$date',$timezone_date))), 
      "day" => array('$dayOfMonth'=>array('$add'=>array('$date',$timezone_date))), 
      "hour" => array('$hour'=> array('$add'=>array('$date',$timezone_date))), 
     ) 
    ), 
    array(
     '$group' => array(
      '_id' => array(
       "valRefId" => '$i', 
       "year" => '$year', 
       "month" => '$month', 
       "day" => '$day', 
       "hour" => '$hour', 
      ), 
      "MaxValue" => array('$max' => '$v'), 
      "MinValue" => array('$min' => '$v'), 
      "Gemiddelde" => array('$avg' => '$v'), 
      "Aantal" => array('$sum' => 1), 
     ) 
    ), 
    array(
     '$sort' => array(
      "_id.valRefId" => 1, 
      "_id.year" => 1, 
      "_id.month" => 1, 
      "_id.day" => 1, 
      "_id.hour" => 1, 
     ) 
    ), 
    array(
     '$project' => array(
      "date" => array(
       '$concat' => array(array('$substr' => array('$_id.year',0,4)), 
        "-", 
        array('$substr' => array('$_id.month',0,2)), 
        "-", 
        array('$substr' => array('$_id.day',0,2)), 
        " ", 
        array('$substr' => array('$_id.hour',0,2)), 
        ":00:00", 
       ), 
      ), 
      "MaxValue" => '$MaxValue', 
      "MinValue" => '$MinValue', 
      "Gemiddelde" => '$Gemiddelde', 
      "Aantal" => '$Aantal', 
     ) 
    ), 
); 

La signification de la fonction est d'obtenir valeurmax, MinValue, moyen et le nombre d'enregistrements dans une fenêtre de temps où $i est dans une gamme donnée ($valRefId) puis par groupe $i, $year, $month, $day et $hour.

En conséquence, j'ai maintenant le "_id". "date", "maxValue", "minValue", "Gemiddelde", "Aantal".

Ma question est maintenant, est-il possible de retourner le champ "date" pas dans le type de chaîne, mais en tant que type Date (ou type d'horodatage)?

Répondre

2

Oui, c'est possible. Vous pouvez retourner le champ de date dans la canalisation $group utilisant l'accumulateur $first comme suit:

$pipeline = array(
    array(
     '$match' => array(
      "i" => array('$in' => $valRefId), 
      "date" => array('$gt'=> $mongotimestart , '$lte'=> $mongotimeend), 
     ), 
    ), 
    array(
     '$project' => array(
      "i" => 1, 
      "v" => 1, 
      "datumpje" => array('$add'=>array('$date',$timezone_date)), 
      "year" => array('$year' =>array('$add'=>array('$date',$timezone_date))), 
      "month" => array('$month'=>array('$add'=>array('$date',$timezone_date))), 
      "day" => array('$dayOfMonth'=>array('$add'=>array('$date',$timezone_date))), 
      "hour" => array('$hour'=> array('$add'=>array('$date',$timezone_date))), 
     ) 
    ), 
    array(
     '$group' => array(
      '_id' => array(
       "valRefId" => '$i', 
       "year" => '$year', 
       "month" => '$month', 
       "day" => '$day', 
       "hour" => '$hour', 
      ), 
      "date" => array('$first' => '$datumpje'), 
      "MaxValue" => array('$max' => '$v'), 
      "MaxValue" => array('$max' => '$v'), 
      "MinValue" => array('$min' => '$v'), 
      "Gemiddelde" => array('$avg' => '$v'), 
      "Aantal" => array('$sum' => 1), 
     ) 
    ), 
    array(
     '$sort' => array(
      "_id.valRefId" => 1, 
      "_id.year" => 1, 
      "_id.month" => 1, 
      "_id.day" => 1, 
      "_id.hour" => 1, 
     ) 
    ) 
); 
+0

Je reçois maintenant la première entrée trouvée dans le groupe par fonction. Je pense que je peux travailler avec ça. Mais il est possible de changer le type de chaîne du champ 'date' en un type de date? –

+0

Il n'existe aucun moyen de convertir la chaîne à ce jour dans le pipeline d'agrégation, mais la date à la chaîne est possible. – chridam