Od wersji Meteor 0.6.5 interfejs API kolekcji nie obsługuje jeszcze zapytań agregujących, ponieważ nie ma (bezpośredniego) sposobu na ich aktualizowanie na żywo. Jednak nadal możesz napisać je samodzielnie i udostępnić je w Meteor.publish
, chociaż wynik będzie statyczny. Moim zdaniem robienie tego w ten sposób jest nadal preferowane, ponieważ można łączyć wiele agregacji i korzystać z interfejsu API do zbierania danych po stronie klienta.
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);
}
)
);
});
Powyższe jest przykładem grupowania/agregacji liczebności. Kilka ważnych rzeczy:
- Gdy to zrobisz, naturalnie wykonasz agregację na
server_collection_name
i wypychanie wyników do innej kolekcji o nazwieclient_collection_name
. - Ta subskrypcja nie będzie aktywna i prawdopodobnie będzie aktualizowana za każdym razem, gdy zmienią się argumenty, więc używamy naprawdę prostej pętli, która po prostu wypycha wszystkie wyniki.
- Wyniki agregacji nie mają identyfikatorów Mongo ObjectID, więc generujemy kilka własnych.
- Wywołanie zwrotne do agregacji musi być opakowane w światłowód. Używam
Meteor.bindEnvironment
tutaj, ale można również użyćFuture
dla większej kontroli na niskim poziomie.
Jeśli zaczniesz łączyć wyniki takich publikacji, musisz dokładnie rozważyć, w jaki sposób losowo generowane identyfikatory wpływają na pole scalania. Jednak prosta implementacja tego jest tylko standardowym zapytaniem do bazy danych, z wyjątkiem tego, że jest wygodniejsza w użyciu po stronie klienta Meteor API.
TL;Wersja DR :Prawie za każdym razem, gdy wysyłasz dane z serwera, publish
jest lepsze niż method
.
Aby uzyskać więcej informacji o różnych sposobach agregacji, sprawdź ten post .