2016-09-06 2 views
1

In PHP habe ich folgendes Mongo Aggregat funnction:php mongo Aggregat Projekt Datumsfeld

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', 
     ) 
    ), 
); 

Die Bedeutung der Funktion ist es, die maxValue, MinValue, Durchschnitt und Anzahl der Datensätze in einem Zeitfenster, wo $i ist in einem bestimmten Feld ($valRefId) und dann Gruppe durch $i, $year, $month, $day und $hour.

Als Ergebnis habe ich jetzt die "_id". "Datum", "MaxValue", "MinValue", "Gemiddelde", "Aantal".

Meine Frage ist jetzt, ist es möglich, das "Datum" -Feld nicht im String-Typ, sondern als Datumstyp (oder Zeitstempel Typ)?

Antwort

2

Ja, es ist möglich. Sie können das Datumsfeld in der $group Pipeline Rückkehr des $first Akkumulator wie folgt verwendet:

$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

ich nun den ersten Eintrag in der Gruppe von Funktion gefunden erhalten. Ich denke, ich kann damit arbeiten. Aber es ist möglich, den String-Typ des Datumsfelds in einen Datumstyp zu ändern? –

+0

Es gibt keine Möglichkeit, Zeichenfolge in Datum in Aggregationspipeline zu konvertieren, jedoch ist Datum in Zeichenfolge möglich. – chridam

Verwandte Themen