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

consulta de meteoritos para todos los documentos con campo único

Hay una configuración general que puede usar para acceder al objeto de colección de controladores subyacente y, por lo tanto, .aggregate() sin instalar ningún otro complemento.

El proceso básico es así:

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

});

Defina una colección para la salida de la agregación y, dentro de una rutina como esta, publique el servicio al que también se suscribirá en su cliente.

Dentro de esto, la agregación se ejecuta y se completa en la otra colección (lógicamente, ya que en realidad no escribe nada). Entonces, usa esa colección en el cliente con la misma definición y todos los resultados agregados se devuelven.

De hecho, tengo una aplicación de ejemplo funcional completa de procesos similares dentro de esta pregunta , así como el uso del agregado de hacks de meteoritos paquete en esta pregunta aquí también, si necesita más referencia.