2017-11-16 1 views
1

Ich bin ein MongoDB-Noob also bitte nicht beurteilen, ob meine Frage dumm ist: P Ich versuche, einige Ergebnisse von MongoDB zu erstellen eine Tabelle, die prozentuelle Statistiken darüber zeigt, wie viel ich pro Tag an einem bestimmten Spiel spiele (alle Spiele zusammen pro Tag = 100%). Dies ist meine JSON Import für die Datenbank:MongoDB-Aggregation - Wie bekomme ich einen prozentualen Wert wie oft ein Ereignis pro Wochentag aufgetreten ist?

[ 
{"title":"GTA","date":"2017-11-13"}, 
{"title":"GTA","date":"2017-11-13"}, 
{"title":"BattleField","date":"2017-11-13"}, 
{"title":"BattleField","date":"2017-11-13"}, 
{"title":"BattleField","date":"2017-11-14"} 
] 

Ive geschrieben eine Aggregation, die die Ergebnisse nach Tagen gruppiert und gezählt, um die Gesamtmenge an mal ein Spiel für jeden Tag gespielt wurde ...:

db.games.aggregate([ 
    { $project: { _id: 0, date : { $dayOfWeek: "$date" }, "title":1} }, 
    { $group: { _id: {title: "$title", date: "$date"}, total: {$sum: 1} } }, 
    { $group: { _id: "$_id.date", types: {$addToSet: {title:"$_id.title", total: "$total"} } } } 
]) 

... und das ist, was ich von MongoDB bekam jetzt:

/* 1 */ 
{ 
    "_id" : 3, 
    "types" : [ 
     { 
      "title" : "BattleField", 
      "total" : 1.0 
     } 
    ] 
}, 

/* 2 */ 
{ 
    "_id" : 2, 
    "types" : [ 
     { 
      "title" : "GTA", 
      "total" : 2.0 
     }, 
     { 
      "title" : "BattleField", 
      "total" : 2.0 
     } 
    ] 
} 

, was ich bekommen müssen, ist eine Tabelle, die wie folgt aussehen:

  Monday  Tuesday 
GTA   50,00%  0% 
BattleField 50,00%  100% 

Könnten Sie mir bitte beraten, wie kann ich solche Prozent Ergebnisse von Mongo bekommen?

Antwort

1

Ihr Versuch war ziemlich nah an einer Lösung! Die folgenden sollten Sie in die richtige Richtung:

aggregate([ 
    { $project: { "_id": 0, "date" : { $dayOfWeek: "$date" }, "title": 1 } }, // get the day of the week from the "date" field 
    { $group: { "_id": { "title": "$title", "date": "$date" }, "total": { $sum: 1 } } }, // group by title and date to get the total per title and date 
    { $group: { "_id": "$_id.date", "types": { $push: { "title": "$_id.title", total: "$total" } }, "grandTotal": { $sum: "$total" } } }, // group by date only to get the grand total 
    { $unwind: "$types" }, // flatten grouped items 
    { $project: { "_id": 0, "title": "$types.title", "percentage": { $divide: [ "$types.total", "$grandTotal" ] }, "day": { $arrayElemAt: [ [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ], "$_id" ] } } }, // calculate percentage and beautify output for "day" 
]) 

Ergebnisse:

{ 
    "title" : "BattleField", 
    "percentage" : 0.5, 
    "day" : "Tue" 
} 
{ 
    "title" : "GTA", 
    "percentage" : 0.5, 
    "day" : "Tue" 
} 
{ 
    "title" : "BattleField", 
    "percentage" : 1.0, 
    "day" : "Wed" 
} 
+0

funktioniert perfekt! Danke:) – davidM

Verwandte Themen