sql >> Base de Datos >  >> NoSQL >> MongoDB

Consultas de agregación promedio en Meteor

A partir de Meteor 0.6.5, la API de recopilación aún no admite consultas de agregación porque no hay una forma (sencilla) de realizar actualizaciones en vivo sobre ellas. Sin embargo, aún puede escribirlos usted mismo y ponerlos a disposición en un Meteor.publish , aunque el resultado será estático. En mi opinión, hacerlo de esta manera sigue siendo preferible porque puede fusionar múltiples agregaciones y usar la API de recopilación del lado del cliente.

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

Lo anterior es un ejemplo de agrupación/agregación de conteo. Algunas cosas a tener en cuenta:

  • Cuando haga esto, naturalmente estará haciendo una agregación en server_collection_name y enviar los resultados a una colección diferente llamada client_collection_name .
  • Esta suscripción no estará disponible y probablemente se actualizará cada vez que cambien los argumentos, por lo que usamos un ciclo realmente simple que solo saca todos los resultados.
  • Los resultados de la agregación no tienen ObjectID de Mongo, por lo que generamos algunos arbitrarios propios.
  • La devolución de llamada a la agregación debe incluirse en una fibra. Yo uso Meteor.bindEnvironment aquí pero también se puede usar un Future para más control de bajo nivel.

Si comienza a combinar los resultados de publicaciones como estas, deberá considerar cuidadosamente cómo las identificaciones generadas aleatoriamente impactan en el cuadro de combinación. Sin embargo, una implementación sencilla de esto es solo una consulta de base de datos estándar, excepto que es más conveniente usarla con las API de Meteor del lado del cliente.

Versión TL;DR :casi cada vez que envía datos desde el servidor, publish es preferible a un method .

Para obtener más información sobre las diferentes formas de agregar, consulte esta publicación .