2016-04-17 11 views
0

hilfreiche Leute von StackOverflow!MongoDB Aggregation und Projektion Problem

Ich bin dabei, zu lernen, wie man mit MongoDB arbeitet, und stehe derzeit mit einem bestimmten Problem fest.

Ich baue eine Gitarre Tabs App, nur mit einem "Künstler" Basisdokument arbeiten. Alle anderen Daten sind Filialdokumente. Abhängig von der aufgerufenen Funktion (z. B. Suche, Registerkarten nach Künstler auflisten, einzelne Registerkarte anzeigen) aggregiere und projiziere ich meine Dokumente entsprechend.

Ich kann jedoch nicht eine Projektion zu arbeiten, wie ich will.

Da die folgenden Daten:

{ 
    "artist" : "Jeff Buckley", 
    "songs" : [ 
     { 
      "name" : "Grace", 
      "tabs" : [ 
       { 
        "version" : 1, 
        "tab" : "...", 
        "tuning" : "DADGBe" 
       }, 
       { 
        "version" : 2, 
        "tab" : "...", 
        "tuning" : "DADGBe" 
       } 
      ] 
     }, 
     { 
      "name" : "Last Goodbye", 
      "tabs" : [ 
       { 
        "version" : 1, 
        "tab" : "...", 
        "tuning" : "DGDGBD" 
       }, 
       { 
        "version" : 2, 
        "tab" : "...", 
        "tuning" : "EADGBe" 
       } 
      ] 
     } 
    ] 
} 

Ich will es die folgende Art und Weise für eine Listenansicht aggregieren:

{ 
    "artist" : "Jeff Buckley", 
    "tabs" : [ 
     { 
      "song" : "Grace", 
      "version" : 1 
     }, 
     { 
      "song" : "Grace", 
      "version" : 2 
     }, 
     { 
      "song" : "Last Goodbye", 
      "version" : 1 
     }, 
     { 
      "song" : "Last Goodbye", 
      "version" : 2 
     }, 
    ] 
} 

Ich versuchte es mit der folgenden Projektion:

db.tabs.aggregate(
    [ 
     { 
      $project : { 
       artist : 1, 
       tabs.song : "$songs.name", 
       tabs.version : "$songs.tabs.version" 
      } 
     } 
    ] 
) 

Aber stattdessen bekam ich:

{ 
    "artist" : "Jeff Buckley", 
    "tabs" : { 
     "version" : [[2,1],[2,1]], 
     "song" : ["Grace","Last Goodbye"] 
    } 
} 

Kann mir jemand in die richtige Richtung zeigen?

Danke!

Antwort

1

Ihre Aggregationsanfrage korrigieren $project nicht nur Ihre json Dokument Schlüssel

Ihre aggretion Abfrage wie folgt

db.tabs.aggregate(
       {$unwind : "$songs"}, 
       {$unwind : "$songs.tabs"}, 
       {$group : { 
          _id:"$artist", 
          tabs:{$push : {song : "$songs.name",version:"$songs.tabs.version"}}}}, 
       {$project : { 
           tabs:"$tabs", 
           artist:"$_id", 
           _id:0}} 
       ).pretty() 
+0

Danke für die Lösung, die sowohl beeinflussen und die Informationen über $ Projekt! – RafaelHamasaki