sql >> Database >  >> NoSQL >> MongoDB

Gemiddelde aggregatiequery's in Meteor

Vanaf Meteor 0.6.5 ondersteunt de collectie-API nog geen aggregatiequery's omdat er geen (eenvoudige) manier is om er live updates voor uit te voeren. U kunt ze echter nog steeds zelf schrijven en beschikbaar maken in een Meteor.publish , hoewel het resultaat statisch zal zijn. Naar mijn mening verdient het nog steeds de voorkeur om het op deze manier te doen, omdat je meerdere aggregaties kunt samenvoegen en de verzamelings-API aan de clientzijde kunt gebruiken.

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

Het bovenstaande is een voorbeeld van groepering/telling van aggregatie. Enkele opmerkingen:

  • Als je dit doet, doe je natuurlijk een aggregatie op server_collection_name en de resultaten naar een andere verzameling te pushen met de naam client_collection_name .
  • Dit abonnement gaat niet live en zal waarschijnlijk worden bijgewerkt wanneer de argumenten veranderen, dus we gebruiken een heel eenvoudige lus die alle resultaten naar buiten duwt.
  • De resultaten van de aggregatie hebben geen Mongo ObjectID's, dus we genereren zelf enkele willekeurige.
  • De callback naar de aggregatie moet worden verpakt in een Fiber. Ik gebruik Meteor.bindEnvironment hier maar men kan ook een Future . gebruiken voor meer controle op laag niveau.

Als u de resultaten van publicaties als deze gaat combineren, moet u zorgvuldig overwegen hoe de willekeurig gegenereerde id's van invloed zijn op het samenvoegvenster. Een eenvoudige implementatie hiervan is echter slechts een standaard databasequery, behalve dat het handiger is om te gebruiken met Meteor API's aan de clientzijde.

TL;DR-versie :Bijna altijd wanneer u gegevens van de server pusht, wordt een publish heeft de voorkeur boven een method .

Voor meer informatie over verschillende manieren om aggregatie uit te voeren, bekijk dit bericht .



  1. Verkrijg array-subset in mongodb met behulp van een arraybron

  2. tel het aantal sessies in connect-redis

  3. Architectuur voor Redis-cache &Mongo voor persistentie

  4. Hoe de vervaldatum van de hash-sleutel in redis in te stellen op basis van het bestaan ​​van de sleutel