Vanaf Meteor 0.6.5 ondersteunt de collectie-API nog geen aggregatiequery's omdat er geen (eenvoudige) manier is om er live updates voor uit te voeren. U kunt ze echter nog steeds zelf schrijven en beschikbaar maken in een Meteor.publish
, hoewel het resultaat statisch zal zijn. Naar mijn mening verdient het nog steeds de voorkeur om het op deze manier te doen, omdat je meerdere aggregaties kunt samenvoegen en de verzamelings-API aan de clientzijde kunt gebruiken.
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);
}
)
);
});
Het bovenstaande is een voorbeeld van groepering/telling van aggregatie. Enkele opmerkingen:
- Als je dit doet, doe je natuurlijk een aggregatie op
server_collection_name
en de resultaten naar een andere verzameling te pushen met de naamclient_collection_name
. - Dit abonnement gaat niet live en zal waarschijnlijk worden bijgewerkt wanneer de argumenten veranderen, dus we gebruiken een heel eenvoudige lus die alle resultaten naar buiten duwt.
- De resultaten van de aggregatie hebben geen Mongo ObjectID's, dus we genereren zelf enkele willekeurige.
- De callback naar de aggregatie moet worden verpakt in een Fiber. Ik gebruik
Meteor.bindEnvironment
hier maar men kan ook eenFuture
. gebruiken voor meer controle op laag niveau.
Als u de resultaten van publicaties als deze gaat combineren, moet u zorgvuldig overwegen hoe de willekeurig gegenereerde id's van invloed zijn op het samenvoegvenster. Een eenvoudige implementatie hiervan is echter slechts een standaard databasequery, behalve dat het handiger is om te gebruiken met Meteor API's aan de clientzijde.
TL;DR-versie :Bijna altijd wanneer u gegevens van de server pusht, wordt een publish
heeft de voorkeur boven een method
.
Voor meer informatie over verschillende manieren om aggregatie uit te voeren, bekijk dit bericht .