MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Requêtes d'agrégation moyenne dans Meteor

Depuis Meteor 0.6.5, l'API de collecte ne prend pas encore en charge les requêtes d'agrégation car il n'existe aucun moyen (simple) de faire des mises à jour en direct sur celles-ci. Cependant, vous pouvez toujours les écrire vous-même, et les rendre disponibles dans un Meteor.publish , bien que le résultat soit statique. À mon avis, procéder de cette manière est toujours préférable car vous pouvez fusionner plusieurs agrégations et utiliser l'API de collecte côté client.

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

Ce qui précède est un exemple d'agrégation de regroupement/comptage. Quelques points à noter :

  • Lorsque vous faites cela, vous ferez naturellement une agrégation sur server_collection_name et pousser les résultats vers une autre collection appelée client_collection_name .
  • Cet abonnement ne sera pas actif et sera probablement mis à jour chaque fois que les arguments changent. Nous utilisons donc une boucle très simple qui ne fait que pousser tous les résultats.
  • Les résultats de l'agrégation n'ont pas d'ObjectID Mongo, nous en générons donc nous-mêmes de manière arbitraire.
  • Le rappel vers l'agrégation doit être encapsulé dans une fibre. J'utilise Meteor.bindEnvironment ici mais on peut aussi utiliser un Future pour plus de contrôle de bas niveau.

Si vous commencez à combiner les résultats de publications comme celles-ci, vous devrez examiner attentivement l'impact des identifiants générés aléatoirement sur la zone de fusion. Cependant, une implémentation simple de ceci est juste une requête de base de données standard, sauf qu'il est plus pratique à utiliser avec les API Meteor côté client.

TL;Version DR  :Presque chaque fois que vous envoyez des données du serveur, un message publish est préférable à une method .

Pour plus d'informations sur les différentes manières de procéder à l'agrégation, consultez cet article .