2016-11-09 1 views
0

Ich versuche eine Gruppe zu erstellen, indem ich ein ID-Feld, ein Datetime-Feld verwende und die Summe der Werte und das Datumsfeld projiziere.

db.getCollection('driver_collections').aggregate([ 
{$group : { _id: {driverid:"$driver_id",day:{ $dayOfMonth: "$time_in"}, 
        month:{$month:"$time_in"},year:{$year:"$time_in"}}, 
    amountCollected : {$sum:"$total_collection"}}  
    },{ 
     $project: { 
      yearMonthDay: { $dateToString: { format: "%Y-%m-%d", date: "$time_in" }}, 
      amountCollected : 1 
     } 
    }]) 

ich obige Abfrage verwendet und erhielt das Ergebnis als

{ 
    "_id" : { 
     "driverid" : "58014ce1f39e0f9dc40000b2", 
     "day" : 30, 
     "month" : 10, 
     "year" : 2016 
    }, 
    "amountCollected" : 2094.0, 
    "yearMonthDay" : null 
} 

Ich brauche JahrMonatTag als

"yerMonthDay" zu bekommen: "2016.10.30"

Wenn ich $ dateToString ohne $ Gruppe verwende, funktioniert es gut. Was habe ich hier vermisst.

+0

Es ist, weil Sie das Feld nicht haben 'time_in' in Ihrer unmittelbaren Pipeline nach der' $ Group' Bühne. – chridam

Antwort

1

einen $ time_in in Ihrer ersten Stufe hinzufügen

db.getCollection('driver_collections').aggregate([ 
    {$group : { _id: {driverid:"$driver_id",day:{ $dayOfMonth: "$time_in"}, 
         month:{$month:"$time_in"},year:{$year:"$time_in"}}, 
    "time_in" : {$first : "$time_in"}, 
     amountCollected : {$sum:"$total_collection"}}  
     },{ 
      $project: { 
       yearMonthDay: { $dateToString: { format: "%Y-%m-%d", date: "$time_in" }}, 
       amountCollected : 1 
      } 
     }])