sql >> Databasteknik >  >> NoSQL >> MongoDB

Genomsnittliga aggregationsfrågor i Meteor

Från och med Meteor 0.6.5 stöder inte samlings-API:et aggregeringsfrågor ännu eftersom det inte finns något (enkelt) sätt att göra liveuppdateringar på dem. Men du kan fortfarande skriva dem själv och göra dem tillgängliga i en Meteor.publish , även om resultatet blir statiskt. Enligt min åsikt är det fortfarande att föredra att göra det på det här sättet eftersom du kan slå samman flera aggregationer och använda API:et för samling på klientsidan.

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);
            }
        )
    );
});

Ovanstående är ett exempel på gruppering/antal aggregering. Några saker att notera:

  • När du gör detta kommer du naturligtvis att göra en aggregering på server_collection_name och skickar resultaten till en annan samling som heter client_collection_name .
  • Denna prenumeration kommer inte att vara live och kommer förmodligen att uppdateras när argumenten ändras, så vi använder en väldigt enkel loop som bara skjuter ut alla resultat.
  • Resultaten av aggregeringen har inte Mongo ObjectID, så vi genererar några godtyckliga egna.
  • Återuppringningen till aggregeringen måste lindas in i en Fiber. Jag använder Meteor.bindEnvironment här men man kan också använda en Future för mer kontroll på låg nivå.

Om du börjar kombinera resultaten av publikationer som dessa, måste du noggrant överväga hur de slumpmässigt genererade ID:n påverkar sammanslagningsrutan. En enkel implementering av detta är dock bara en standarddatabasfråga, förutom att den är bekvämare att använda med Meteor APIs klientsida.

TL;DR-version :Nästan varje gång du trycker ut data från servern, en publish är att föredra framför en method .

För mer information om olika sätt att göra aggregering, kolla in det här inlägget .



  1. Hur tillåter jag JSON-data i fritt format i Mongoose-dokument?

  2. Hur push-notiser med angular.js?

  3. Anslut till redis från en annan container i docker

  4. Anslutningen vägrades till MongoDB fel nr 111