Ab Meteor 0.6.5 unterstützt die Sammlungs-API noch keine Aggregationsabfragen, da es keine (einfache) Möglichkeit gibt, Live-Updates für sie durchzuführen. Sie können sie jedoch immer noch selbst schreiben und in einer Meteor.publish
zur Verfügung stellen , obwohl das Ergebnis statisch sein wird. Meiner Meinung nach ist diese Vorgehensweise immer noch vorzuziehen, da Sie mehrere Aggregationen zusammenführen und die clientseitige Sammlungs-API verwenden können.
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);
}
)
);
});
Das Obige ist ein Beispiel für eine Gruppierung/Zählaggregation. Einige Anmerkungen:
- Wenn Sie dies tun, führen Sie natürlich eine Aggregation auf
server_collection_name
durch und Pushen der Ergebnisse in eine andere Sammlung namensclient_collection_name
. - Dieses Abonnement wird nicht live sein und wird wahrscheinlich aktualisiert, wenn sich die Argumente ändern, also verwenden wir eine wirklich einfache Schleife, die einfach alle Ergebnisse herausschiebt.
- Die Ergebnisse der Aggregation haben keine Mongo ObjectIDs, also generieren wir einige willkürliche eigene.
- Der Rückruf an die Aggregation muss in eine Faser eingeschlossen werden. Ich verwende
Meteor.bindEnvironment
hier kann man aber auch einFuture
verwenden für mehr Low-Level-Steuerung.
Wenn Sie damit beginnen, die Ergebnisse solcher Veröffentlichungen zu kombinieren, müssen Sie sorgfältig abwägen, wie sich die zufällig generierten IDs auf die Mergebox auswirken. Eine direkte Implementierung davon ist jedoch nur eine Standard-Datenbankabfrage, außer dass es bequemer ist, sie clientseitig mit Meteor-APIs zu verwenden.
TL;DR-Version :Fast jedes Mal, wenn Sie Daten vom Server schieben, ein publish
ist einer method
vorzuziehen .
Weitere Informationen zu verschiedenen Möglichkeiten der Aggregation finden Sie in diesem Beitrag .