Från och med Meteor 0.6.5 stöder inte samlings-API:et aggregeringsfrågor ännu eftersom det inte finns något (enkelt) sätt att göra liveuppdateringar på dem. Men du kan fortfarande skriva dem själv och göra dem tillgängliga i en Meteor.publish
, även om resultatet blir statiskt. Enligt min åsikt är det fortfarande att föredra att göra det på det här sättet eftersom du kan slå samman flera aggregationer och använda API:et för samling på klientsidan.
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);
}
)
);
});
Ovanstående är ett exempel på gruppering/antal aggregering. Några saker att notera:
- När du gör detta kommer du naturligtvis att göra en aggregering på
server_collection_name
och skickar resultaten till en annan samling som heterclient_collection_name
. - Denna prenumeration kommer inte att vara live och kommer förmodligen att uppdateras när argumenten ändras, så vi använder en väldigt enkel loop som bara skjuter ut alla resultat.
- Resultaten av aggregeringen har inte Mongo ObjectID, så vi genererar några godtyckliga egna.
- Återuppringningen till aggregeringen måste lindas in i en Fiber. Jag använder
Meteor.bindEnvironment
här men man kan också använda enFuture
för mer kontroll på låg nivå.
Om du börjar kombinera resultaten av publikationer som dessa, måste du noggrant överväga hur de slumpmässigt genererade ID:n påverkar sammanslagningsrutan. En enkel implementering av detta är dock bara en standarddatabasfråga, förutom att den är bekvämare att använda med Meteor APIs klientsida.
TL;DR-version :Nästan varje gång du trycker ut data från servern, en publish
är att föredra framför en method
.
För mer information om olika sätt att göra aggregering, kolla in det här inlägget .