MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

query meteor per tutti i documenti con campo univoco

È possibile utilizzare una configurazione generale per accedere all'oggetto di raccolta del driver sottostante e quindi .aggregate() senza installare altri plugin.

Il processo di base è questo:

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

});

Quindi definisci una raccolta per l'output dell'aggregazione e all'interno di una routine come questa pubblichi il servizio a cui ti iscriverai anche nel tuo client.

All'interno di questo, l'aggregazione viene eseguita e popolata nell'altra raccolta ( logicamente poiché in realtà non scrive nulla ). Quindi utilizzi quella raccolta sul client con la stessa definizione e tutti i risultati aggregati vengono semplicemente restituiti.

In realtà ho un'applicazione di esempio funzionante completa di processi simili all'interno di questa domanda , nonché l'utilizzo del aggregato di hack di meteoriti pacchetto su questa domanda anche qui, se hai bisogno di ulteriore riferimento.