MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Média de consultas de agregação no Meteor


A partir do Meteor 0.6.5, a API de coleta ainda não suporta consultas de agregação porque não há uma maneira (direta) de fazer atualizações ao vivo nelas. No entanto, você ainda pode escrevê-los e disponibilizá-los em um Meteor.publish , embora o resultado seja estático. Na minha opinião, fazer dessa maneira ainda é preferível porque você pode mesclar várias agregações e usar a API de coleta do lado do 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);
            }
        )
    );
});

O acima é um exemplo de agregação de agrupamento/contagem. Algumas coisas de nota:
  • Ao fazer isso, você naturalmente estará fazendo uma agregação em server_collection_name e enviar os resultados para uma coleção diferente chamada client_collection_name .
  • Esta assinatura não estará ativa e provavelmente será atualizada sempre que os argumentos mudarem, então usamos um loop muito simples que apenas envia todos os resultados.
  • Os resultados da agregação não têm ObjectIDs do Mongo, então geramos alguns deles próprios.
  • O retorno de chamada para a agregação precisa ser encapsulado em uma fibra. Eu uso Meteor.bindEnvironment aqui, mas também pode-se usar um Future para mais controle de baixo nível.

Se você começar a combinar os resultados de publicações como essas, precisará considerar cuidadosamente como os IDs gerados aleatoriamente afetam a caixa de mesclagem. No entanto, uma implementação direta disso é apenas uma consulta de banco de dados padrão, exceto que é mais conveniente usar com APIs Meteor do lado do cliente.

TL;versão DR :Quase sempre que você estiver enviando dados do servidor, um publish é preferível a um method .

Para obter mais informações sobre diferentes formas de agregação, confira esta postagem .