2017-03-07 6 views
1

Ich habe einige Flugdaten in json dieses Format verwenden:Mongo temps in Aggregationen

{"_id":{"$oid":"587d12881603f94800054dc5"},"flight_date":{"$date":"2015-08-23T00:00:00.000Z"},"flight_number":863,"destination_city":" Baltimore, MD","delay_in_minutes":0.0,"cancelled":0.0} 

Ich versuche, den Monat mit dem höchsten Verhältnis von annullierten Flügen zu tun ist, zu finden. Der Code Ich habe die stornierten Flüge nach Monat gruppiert und teilt jede von ihnen durch die Gesamtzahl der Flüge für das Jahr. Ich möchte die stornierten Flüge für jeden Monat auf die gesamten Flüge für diesen Monat verteilen (storniert und nicht storniert), damit ich das richtige Verhältnis habe.

Ich lerne gerade Mongo, also zeigen Sie bitte meine Fehler und ich werde sie beheben.

Antwort

0

Es gibt einige Dinge, die Sie tun können, um die gewünschte Ausgabe zu bekommen.

Vorschläge:

Sie $match Bühne $cond unter Verwendung verschmelzen können die cancelled Flüge in $group Bühne zu bieten.

Sie können $month helper verwenden, um Monat von Datum zu extrahieren und die $project Bühne in $group Bühne zu verschmelzen.

Antwort:

db.flights.aggregate([{ 
    $group: { 
     _id: { 
      $month: "$flight_date" 
     }, 
     total_flights: { 
      $sum: 1 
     }, 
     cancelled_flights: { 
      $sum: { 
       $cond: [{ 
        $eq: ["$cancelled", 1] 
       }, 1, 0] 
      } 
     } 
    } 
}, { 
    $project: { 
     ratio: { 
      $divide: ["$cancelled_flights", "$total_flights"] 
     } 
    } 
}, { 
    $sort: { 
     "ratio": -1 
    } 
}, { 
    $limit: 1 
}]) 
+0

Bitte erläutern Sie, warum es downvoted wurde. – Veeram

+0

Ich war nicht der Downvoter, aber deine vorherige Überarbeitung, die "Antwort hier" hatte. mit einem Link war keine gute Antwort von Stack-Overflow-Standards. Ich bin mir nicht sicher, warum Sie das gewählt haben, aber gute SO-Antworten enthalten alle Informationen in der Antwort und keine Links. Ich bin besonders verwirrt, warum du dich dafür entschieden hast, eine frühere Version deiner Antwort zu verlinken ... – Chris

+0

@Chris Danke Chris, dass du dich hier ausgesucht hast. Ich habe keinen anderen Weg gefunden, weil Op Vorschläge wollte und nicht antwortete, so dass ich meine Antwort verstecken konnte. Er kann also auf die Ansicht klicken, nachdem er diese Vorschläge ausprobiert hat. – Veeram

1

Sie können die Summe von annullierten Flügen und nicht gestrichenen Flüge in der gleichen $ group cond Aussagen

{ 
    $group: { 
     _id: "$month", 
     total: { $sum: 1 }, 
     total_canceled: { $sum: { $cond: [{ $eq: ['cancelled_flights', true] }, 1, 0] } } 
     total_non_canceled: { $sum: { $cond: [{ $eq: ['cancelled_flights', false] }, 1, 0] } } 
    } 
}, 

$ Cond Anweisungen arbeiten wie $ Cond mit $ erhalten: [ Bedingung, wenn True, wenn False]

also oben hätten Sie sum 'wenn übereinstimmt cond', 1, wenn nicht, 0

Sie könnten dann diese Ergebnisse verwenden, um die Informationen weiter zu verarbeiten wie Sie wählen

Die Gruppe gibt Ihnen die tatsächliche Anzahl der Flüge, die Gesamtzahl der annullierten Flüge und die Gesamtzahl der nicht stornierten Flüge alle in 1 $ Gruppe Erklärung.

Verwandte Themen