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 chamadaclient_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 umFuture
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 .