Pokud používáte agregát meteorických hacků
balíček pro implementaci .aggregate()
příkaz na vaší sbírce, pak jako odpověď pouze vrátí pole. Takže to musíte zapracovat do podoby publikované sbírky:
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();
});
Nebo zahrnout false
se počítá, jak váš navrhovaný výstup navrhuje sám:
{ "$group": {
"_id": "$userId",
"progressState": { "$first": true },
"count": { "$sum": { "$cond": ["$progressState", 1,0] }
}},
{ "$sort": { "_id": 1 } }
Jako kanál s $cond
vyhodnocení převést na číselné.
Kde v základní agregaci jen "sčítáte" shodné výsledky a samozřejmě $sort
odkazuje na pole přítomné ve výstupu, což by ve vašem příkladu byla hodnota "userId" nyní v _id
klíč z agregace, ale mohl by být také "počítán" k objednávce podle celkového počtu, pokud chcete.
Tato část produkovala chybu, jako $sort
je aktuální pole a nikoli hodnota pole s $
notace.
Ale samozřejmě, abyste mohli publikovat jako kolekci přístupnou klientovi, musíte nahradit skutečné _id
s něčím očekávaným. Takže zde funguje náhodné generování id, stejně jako zahrnutí ostatních polí.
Pro trochu více podrobností a také alternativu k balíčku „hacks“, který funguje pouze s vanilla instalací, existuje také tato odpověď od sebe, který má jako příklad úplný seznam.