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

Query di aggregazione media in Meteor

A partire da Meteor 0.6.5, l'API di raccolta non supporta ancora le query di aggregazione perché non esiste un modo (semplice) per eseguire aggiornamenti in tempo reale su di esse. Tuttavia, puoi ancora scriverli tu stesso e renderli disponibili in un Meteor.publish , anche se il risultato sarà statico. A mio parere, è ancora preferibile farlo in questo modo perché puoi unire più aggregazioni e utilizzare l'API di raccolta lato 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);
            }
        )
    );
});

Quanto sopra è un esempio di raggruppamento/aggregazione di conteggio. Alcune cose degne di nota:

  • Quando lo fai, farai naturalmente un'aggregazione su server_collection_name e inviando i risultati a una raccolta diversa denominata client_collection_name .
  • Questo abbonamento non sarà attivo e probabilmente verrà aggiornato ogni volta che gli argomenti cambiano, quindi utilizziamo un ciclo molto semplice che spinge fuori tutti i risultati.
  • I risultati dell'aggregazione non hanno Mongo ObjectID, quindi ne generiamo alcuni arbitrari.
  • Il callback all'aggregazione deve essere racchiuso in una fibra. Uso Meteor.bindEnvironment qui ma si può anche usare un Future per un controllo di livello più basso.

Se inizi a combinare i risultati di pubblicazioni come queste, dovrai considerare attentamente in che modo gli ID generati casualmente influiscono sulla casella di unione. Tuttavia, una semplice implementazione di questo è solo una query di database standard, tranne per il fatto che è più conveniente da usare con le API Meteor lato client.

TL;versione DR :Quasi ogni volta che stai espellendo i dati dal server, una publish è preferibile a un method .

Per ulteriori informazioni sui diversi modi per eseguire l'aggregazione, dai un'occhiata a questo post .