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

Durchschnittliche Aggregationsabfragen in Meteor

Ab Meteor 0.6.5 unterstützt die Sammlungs-API noch keine Aggregationsabfragen, da es keine (einfache) Möglichkeit gibt, Live-Updates für sie durchzuführen. Sie können sie jedoch immer noch selbst schreiben und in einer Meteor.publish zur Verfügung stellen , obwohl das Ergebnis statisch sein wird. Meiner Meinung nach ist diese Vorgehensweise immer noch vorzuziehen, da Sie mehrere Aggregationen zusammenführen und die clientseitige Sammlungs-API verwenden können.

Meteor.publish("someAggregation", function (args) {
    var sub = this;
    // This works for Meteor 0.6.5
    var db = MongoInternals.defaultRemoteCollectionDriver().mongo.db;

    // Your arguments to Mongo's aggregation. Make these however you want.
    var pipeline = [
        { $match: doSomethingWith(args) },
        { $group: {
            _id: whatWeAreGroupingWith(args),
            count: { $sum: 1 }
        }}
    ];

    db.collection("server_collection_name").aggregate(        
        pipeline,
        // Need to wrap the callback so it gets called in a Fiber.
        Meteor.bindEnvironment(
            function(err, result) {
                // Add each of the results to the subscription.
                _.each(result, function(e) {
                    // Generate a random disposable id for aggregated documents
                    sub.added("client_collection_name", Random.id(), {
                        key: e._id.somethingOfInterest,                        
                        count: e.count
                    });
                });
                sub.ready();
            },
            function(error) {
                Meteor._debug( "Error doing aggregation: " + error);
            }
        )
    );
});

Das Obige ist ein Beispiel für eine Gruppierung/Zählaggregation. Einige Anmerkungen:

  • Wenn Sie dies tun, führen Sie natürlich eine Aggregation auf server_collection_name durch und Pushen der Ergebnisse in eine andere Sammlung namens client_collection_name .
  • Dieses Abonnement wird nicht live sein und wird wahrscheinlich aktualisiert, wenn sich die Argumente ändern, also verwenden wir eine wirklich einfache Schleife, die einfach alle Ergebnisse herausschiebt.
  • Die Ergebnisse der Aggregation haben keine Mongo ObjectIDs, also generieren wir einige willkürliche eigene.
  • Der Rückruf an die Aggregation muss in eine Faser eingeschlossen werden. Ich verwende Meteor.bindEnvironment hier kann man aber auch ein Future verwenden für mehr Low-Level-Steuerung.

Wenn Sie damit beginnen, die Ergebnisse solcher Veröffentlichungen zu kombinieren, müssen Sie sorgfältig abwägen, wie sich die zufällig generierten IDs auf die Mergebox auswirken. Eine direkte Implementierung davon ist jedoch nur eine Standard-Datenbankabfrage, außer dass es bequemer ist, sie clientseitig mit Meteor-APIs zu verwenden.

TL;DR-Version :Fast jedes Mal, wenn Sie Daten vom Server schieben, ein publish ist einer method vorzuziehen .

Weitere Informationen zu verschiedenen Möglichkeiten der Aggregation finden Sie in diesem Beitrag .