Se você estiver usando o agregado de hacks de meteoros pacote para implementar um
.aggregate()
command em sua coleção, ele retornará apenas uma matriz em resposta. Então você precisa trabalhar isso em uma forma de uma coleção publicada:Meteor.publish("completedLB,function() {
var self = this;
var results = userCompleted.aggregate([
{ "$match": { "progressState": true } },
{ "$group": {
"_id": "$userId",
"progressState": { "$first": "$progressState" },
"count": { "$sum": 1 }
}},
{ "$sort": { "_id": 1 } }
]);
_.each(results,function(result) {
self.added("client_collection_name",Random.id(), {
userId: result._id,
progressState: result.progressState,
count: result.count
});
});
self.ready();
});
Ou para incluir o
false
conta como sua saída sugerida sugere: { "$group": {
"_id": "$userId",
"progressState": { "$first": true },
"count": { "$sum": { "$cond": ["$progressState", 1,0] }
}},
{ "$sort": { "_id": 1 } }
Como o pipeline com um
$cond
avaliação para converter para numérico. Onde na agregação básica você está apenas "totalizando" os resultados correspondentes e, claro, o
$sort
refere-se a um campo presente na saída, que pelo seu exemplo seria o valor "userId" agora no _id
key da agregação, mas também pode ser "count" para ordenar pela contagem total, se desejado. Essa parte estava produzindo o erro, como
$sort
é um campo presente e não um valor de campo com $
notação. Mas é claro que para publicar como uma coleção acessível ao cliente, você precisa substituir o
_id
real com algo esperado. Portanto, a geração de ID aleatório funciona aqui, assim como a inclusão dos outros campos. Para um pouco mais de detalhes, e também uma alternativa ao pacote "hacks" que funciona apenas com uma instalação vanilla, há também esta resposta por mim que tem uma listagem completa como exemplo.