2015-04-26 14 views
5

Ich habe dieses Dokument in mongodb:MongoDB - Gruppe zusammengesetzten Schlüssel mit verschachtelten Feldern

{ 
"_id":"26/04/2015 09:50", 
"reservations":130, 
"Event_types":[ 
    { 
    "type":"Party", 
    "events":[ 
     { 
      "eventName":"After Party", 
      "total_count":130, 
      "by":[ 
       { 
       "siteName":"club8", 
       "countArray":[ 
        { 
         "bucket":"default", 
         "value":40 
        } 
       ] 
       }, 
       { 
       "siteName":"PostParty", 
       "countArray":[ 
        { 
         "bucket":"1", 
         "value":70 
        }, 
        { 
         "bucket":"2", 
         "value":20 
        } 
       ] 
       } 
      ] 
     } 
     ] 
    } 
] 
} 

Was ich suche

Ich möchte durch diese den „Wert“ Feld und Gruppe zusammenzufassen Felder:

  1. Typ
  2. eventname
  3. site

Also für das Dokument, das ich ich habe zu bekommen erwarten:

  1. Für die Kombination { "Party", "After-Party", "club8"} eine Summe von 40
  2. für die Kombination { "Party", "After-Party", "PostParty"} eine Summe von 90

Was ich versucht habe

Ich habe versucht, den Aggregat-Operator mit einem zusammengesetzten Schlüssel für die _id mit:

db.testing.aggregate(
{ 
$group : { 
    _id : 
    { 
    type:'$Event_types.type', 
    name: '$Event_types.events.eventName', 
    siteName: '$Event_types.events.by.siteName' 
    } 
    , total : { $sum : '$Event_types.events.by.countArray.value' } 
} 
}); 

Die Ergebnisse

ein Dokument, mit 3-Arrays - einem für jeden Wert, den ich von gruppieren möge. Das Array "siteName" enthält die 2 Werte, die für "siteName" verfügbar sind. Die "Summe" scheint nichts zusammenzufassen, und sie erscheint nur einmal - ich erwartete, sie neben jedem "SiteName" -Wert im Dokument zu sehen.

{ 
    "_id":{ 
     "type":[ 
     "Party" 
     ], 
     "name":[ 
     [ 
      "After Party" 
     ] 
     ], 
     "siteName":[ 
     [ 
      [ 
       "club8", 
       "PostParty" 
      ] 
     ] 
     ] 
    }, 
    "total":0 
} 

Am I „Aggregate“ in die falsche Art und Weise verwendet oder ist das Schema verwende ich nicht für mein Ziel passen? Danke.

Antwort

6

Sie müssen zunächst den Operator $unwind für alle Arrays anwenden, damit Sie die Aggregationsberechnungen mit dem Operator $group später in den Pipelinestufen durchführen können. Am Ende Sie mit einer Aggregation Pipeline am Ende wie folgt werden:

db.testing.aggregate([ 
    { "$unwind": "$Event_types" }, 
    { "$unwind": "$Event_types.events" }, 
    { "$unwind": "$Event_types.events.by" }, 
    { "$unwind": "$Event_types.events.by.countArray" }, 
    { 
     "$group": { 
      "_id": { 
       "type": "$Event_types.type", 
       "name": "$Event_types.events.eventName", 
       "siteName": "$Event_types.events.by.siteName" 
      }, 
      "total": { 
       "$sum": "$Event_types.events.by.countArray.value" 
      } 
     } 
    }, 
    { 
     "$project": { 
      "_id": 0, 
      "type": "$_id.type", 
      "name": "$_id.name", 
      "siteName": "$_id.siteName", 
      "total": 1 
     } 
    } 
]); 

Ausgabe

/* 1 */ 
{ 
    "result" : [ 
     { 
      "total" : 90, 
      "type" : "Party", 
      "name" : "After Party", 
      "siteName" : "PostParty" 
     }, 
     { 
      "total" : 40, 
      "type" : "Party", 
      "name" : "After Party", 
      "siteName" : "club8" 
     } 
    ], 
    "ok" : 1 
} 
+1

Danke, das löst mein Problem! – assafm

+0

@assafm Keine Sorge :-) Ich bin froh, Ihnen helfen zu können. – chridam

Verwandte Themen