2016-05-29 5 views
0

Ich habe diese Aggregat-Publish-Funktion aus dem Meteor-reaktiven Aggregat-Paket. Ich versuche, alle Werte im Matches-Array zu aggregieren. Nicht sicher, wo in der Funktion muss ich das Array für die Aggregation angeben (Lesen der Dokumente ich bin mir nicht sicher, wo genau). Ich habe auch ein paar Dinge erfolglos ausprobiert.Aggregieren Sie alle Elemente eines Arrays in einem Objekt Mongo/Meteor

Veröffentlichen Aggregation

Meteor.publish('reportTotals', function() { 
ReactiveAggregate(this, Players, [{ 
//grouping the items 
$group: { 
    '_id': this.userId, 
    'score': { 
    $sum: '$score' 
    }, 
    'assists': { 
    $sum: '$assists' 
    } 
} 
}, { 
$project: { 
    score: '$score', 
    assists: '$assists' 
} 
}], { 
    clientCollection: 'playerReport' 
    }); 
}); 

Und dies ist ein Beispiel für ein Objekt, in dem es möglicherweise mehr Übereinstimmungen, die ich brauche, um die Partituren, hilft zu kompilieren, ect.

{ "_id": "WhrZCTtj9HHtDB3rs", 
    "name": "Test player", 
    "team": "TThqi8Wu6YJh6mapC", 
    "practicesAttended": 3, 
    "createdBy": "RKtpy532sgzbBpP4J", 
    "createdAt": "2016-05-29T16:26:47.837Z", 
    "notes": "Small test notes", 
    "itemImage": "Lfb27GnWXDRxfkajL", 
    "Matches": [ 
    { 
     "match": "2016-05-21", 
     "score": 3, 
     "shotsTaken": 4, 
     "assists": 0, 
     "duelsWon": 4, 
     "duelsLost": 2, 
     "tacklesWon": 0, 
     "tacklesLost": 0, 
     "blocks": 51 
    } 
    ] 
} 

Antwort

1

Verwenden Sie den $unwind Operator, wird es entwickeln oder Embedded-Arrays in mehrere einzigartige Elemente abzuflachen. Für jedes Eingabedokument gibt es also n Dokumente aus, wobei n die Anzahl der Array-Elemente ist und für ein leeres Array Null sein kann.

Hinweis: Der Feldname, auf dem $unwind angewandt wird, soll mit $ (Dollarzeichen)

In Ihrem Fall oben, Rohr $unwind zu $group vorangestellt werden. Dies ist vergleichbar mit der Verwendung LEFT JOIN ... GROUP BY in SQL:

Meteor.publish('reportTotals', function() { 
    ReactiveAggregate(this, Players, [ 
     // unwind the Matches list 
     { "$uniwnd": "$Matches" }, 
     //grouping the items 
     { 
      "$group": { 
       "_id": this.userId, 
       "score": { "$sum": "$Matches.score" }, 
       "assists": { "$sum": "$Matches.assists" } 
      } 
     } 
    ], { clientCollection: 'playerReport' }); 
}); 
+0

Dank für diese schnelle Antwort. Wenn ich eine Hilfsfunktion erstelle, die die * playerReport * -Sammlung zurückgibt, spuckt die Konsole _ReferenceError: playerReport ist nicht definiert_. Ich habe * reportTotals * abonniert und das ist meine Funktion 'reportTotals: function() {return playerReport.find(); } vermisse ich etwas? –

+0

und ja, die Sammlung ist erstellt und ich sehe es in Meteor Spielzeug, aus irgendeinem Grund kann ich es nicht in der Ansicht ziehen und eine {{#each reportTotals}} machen, um die {{score}} und {{hilft }} ... :( –

Verwandte Themen