MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB-Aggregations- und Gruppierungsproblem in MeteorJS

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.