Wenn Sie das Meteor-Hacks-Aggregat
verwenden Paket, um ein .aggregate()
zu implementieren Befehl für Ihre Sammlung, dann wird nur ein Array als Antwort zurückgegeben. Sie müssen das also in eine Form einer veröffentlichten Sammlung einarbeiten:
Meteor.publish("completedLB,function() {
var self = this;
var results = userCompleted.aggregate([
{ "$match": { "progressState": true } },
{ "$group": {
"_id": "$userId",
"progressState": { "$first": "$progressState" },
"count": { "$sum": 1 }
}},
{ "$sort": { "_id": 1 } }
]);
_.each(results,function(result) {
self.added("client_collection_name",Random.id(), {
userId: result._id,
progressState: result.progressState,
count: result.count
});
});
self.ready();
});
Oder um false
einzuschließen zählt, wie sich Ihre vorgeschlagene Ausgabe anbietet:
{ "$group": {
"_id": "$userId",
"progressState": { "$first": true },
"count": { "$sum": { "$cond": ["$progressState", 1,0] }
}},
{ "$sort": { "_id": 1 } }
Als Pipeline mit einem $cond
Auswertung in numerisch umzuwandeln.
Wobei Sie in der grundlegenden Aggregation nur die übereinstimmenden Ergebnisse "summieren" und natürlich die $sort
bezieht sich auf ein in der Ausgabe vorhandenes Feld, das in Ihrem Beispiel der Wert "userId" jetzt in _id
wäre Schlüssel aus der Aggregation, könnte aber auch "Anzahl" sein, um bei Bedarf nach der Gesamtzahl zu ordnen.
Dieser Teil erzeugte den Fehler als $sort
ist ein vorhandenes Feld und kein Feldwert mit $
Schreibweise.
Aber um als Client-zugängliche Sammlung zu veröffentlichen, müssen Sie natürlich die tatsächliche _id
ersetzen mit etwas erwartet. Die zufällige ID-Generierung funktioniert hier also ebenso wie die Einbeziehung der anderen Felder.
Für ein bisschen mehr Details und auch eine Alternative zum "Hacks"-Paket, das nur mit einer Vanilla-Installation funktioniert, gibt es auch diese Antwort von mir, die eine vollständige Auflistung als Beispiel hat.