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

Meteor-Abfrage für alle Dokumente mit eindeutigem Feld

Es gibt ein allgemeines Setup, mit dem Sie auf das zugrunde liegende Treibersammlungsobjekt zugreifen können, und daher .aggregate() ohne andere Plugins zu installieren.

Der grundlegende Prozess sieht folgendermaßen aus:

FooAges = new Meteor.Collection("fooAges");

Meteor.publish("fooAgeQuery", function(args) {
    var sub = this;

    var db = MongoInternals.defaultRemoteCollectionDriver().mongo.db;

    var pipeline = [
        { "$group": {
            "_id": "$age", 
            "name": { "$max": "$name" }
        }}
    ];

    db.collection("foo").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("fooAges", Random.id(), {
                        "age": e._id,
                        "name": e.name
                    });
                });
                sub.ready();
            },
            function(error) {
                Meteor._debug( "Error doing aggregation: " + error);
            }
        )
    );

});

Sie definieren also eine Sammlung für die Ausgabe der Aggregation und veröffentlichen dann innerhalb einer Routine wie dieser den Dienst, den Sie auch in Ihrem Client abonnieren werden.

Darin wird die Aggregation ausgeführt und in die andere Sammlung gefüllt (logischerweise, da sie eigentlich nichts schreibt). Sie verwenden diese Sammlung dann auf dem Client mit derselben Definition, und alle aggregierten Ergebnisse werden einfach zurückgegeben.

Ich habe tatsächlich eine voll funktionsfähige Beispielanwendung eines ähnlichen Prozesses in dieser Frage , sowie die Verwendung des Meteor-Hacks-Aggregats Paket auf dieser Frage auch hier, falls Sie weitere Referenzen benötigen.