2017-05-10 6 views
0

Ich bin neu in MongoDB. Aber ich habe das Verständnis einiger aggregate Funktionen/Operatoren.Holen Sie hierarchische verschachtelte Daten von MongoDB

Zuerst bitte einen Blick auf die Daten haben (es enthält Cricket Informationen Spiele):

Ein Eintrag (Zeile) sieht wie folgt aus:

{ 
    "ID": 577, 
    "Inning": 1, 
    "BattingTeam": "Sunrisers Hyderabad", 
    "BowlingTeam": "Royal Challengers Bangalore", 
    "Over": 1, 
    "Bowler": "S Aravind", 
    "Ball": 1, 
    "Batsman": "DA Warner", 
    "NonStriker": "S Dhawan", 
    "TotalRuns": 1 
} 
... 
... 

Hier ist die gesamte Datendatei: http://raw.sam016.com/shared/match_data.json Diejenigen

, die nicht Cricket wissen (wie ich), ist hier wenig Info:

  • A Match 2 Inning enthält [1, 2]
  • Jede Inning enthält einige overs [20, 60]
  • jeweils über enthält 6 Kugeln max

ich diese Daten/Gruppe in solche aggregieren möchte eine Möglichkeit, die folgende Art von hierarchischem Ergebnis zu erhalten:

[{ 
    "ID": 577, 
    "Innings": [{ 
      "Inning": 1, 
      "BattingTeam": "Sunrisers Hyderabad", 
      "BowlingTeam": "Royal Challengers Bangalore", 
      "Overs": [ 
       { 
        "Over": 1, 
        "Bowler": "S Aravind", 
        "Balls": [ 
         { 
          "Ball": 1, 
          "Batsman": "DA Warner", 
          "NonStriker": "S Dhawan", 
          "TotalRuns": 1 
         }, 
         {...}, 
         {...} 
        ] 
       }, 
       {...}, 
       {...} 
      ] 
     }, 
     { 
      "Inning": 2, 
      "BattingTeam": "Royal Challengers Bangalore", 
      "BowlingTeam": "Sunrisers Hyderabad", 
      "Overs": [ 
       { 
        "Over": 1, 
        "Bowler": "B Kumar", 
        "Balls": [ 
         { 
          "Ball": 1, 
          "Batsman": "CH Gayle", 
          "NonStriker": "V Kohli", 
          "TotalRuns": 0 
         }, 
         {...}, 
         {...} 
        ] 
       }, 
       {...}, 
       {...} 
      ] 
     } 
    ] 
}] 

Jede Art von Hilfe wäre willkommen.

Antwort

1

Sie können unten Aggregationspipeline versuchen.

Sie nur $group auf Schlüssel und $push die Daten zum Erstellen jeder Ebene.

Beginnen Sie mit der innersten Ebene Balls und arbeiten Sie sich bis zur Innings.

db.cricket.aggregate({ 
    $group: { 
     "_id": { 
      "ID": "$ID", 
      "Inning": "$Inning", 
      "BattingTeam": "$BattingTeam", 
      "BowlingTeam": "$BowlingTeam", 
      "Over": "$Over", 
      "Bowler": "$Bowler" 
     }, 
     "Balls": { 
      $push: { 
       "Ball": "$Ball", 
       "Batsman": "DA Warner", 
       "NonStriker": "S Dhawan", 
       "TotalRuns": "$TotalRuns" 
      } 
     } 
    } 
}, 
{ 
    $group: { 
     _id: { 
      "ID": "$_id.ID", 
      "Inning": "$_id.Inning", 
      "BattingTeam": "$_id.BattingTeam", 
      "BowlingTeam": "$_id.BowlingTeam" 
     }, 
     "Overs": { 
      $push: { 
       "Over": "$_id.Over", 
       "Bowler": "$_id.Bowler", 
       "Balls":"$Balls" 
      } 
     } 
    } 
}, 
{ 
    $group: { 
     "_id": "$_id.ID", 
     "Innings": { 
      $push: { 
       "Inning": "$_id.Inning", 
       "BattingTeam": "$_id.BattingTeam", 
       "BowlingTeam": "$_id.BowlingTeam", 
       "Overs":"$Overs" 
      } 
     } 
    } 
}) 
+0

Danke !!! Es funktionierte. – sam

+0

Wie wird es sortiert? Ich habe versucht, '$ sort' durch inning> over> ball hinzuzufügen. Aber das Endergebnis ist nicht sortiert. – sam

+0

Sie müssen eine Ebene nach der anderen sortieren. Für das erste Level brauchst du also $ sort, bevor du schiebst. Etwas wie '{$ sort: {Ball: 1}}' vor der ersten $ Gruppe und so weiter für den Rest der Level. – Veeram