Có một thiết lập chung mà bạn có thể sử dụng để truy cập đối tượng thu thập trình điều khiển cơ bản và do đó .aggregate()
mà không cần cài đặt bất kỳ plugin nào khác.
Quá trình cơ bản diễn ra như sau:
FooAges = new Meteor.Collection("fooAges");
Meteor.publish("fooAgeQuery", function(args) {
var sub = this;
var db = MongoInternals.defaultRemoteCollectionDriver().mongo.db;
var pipeline = [
{ "$group": {
"_id": "$age",
"name": { "$max": "$name" }
}}
];
db.collection("foo").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("fooAges", Random.id(), {
"age": e._id,
"name": e.name
});
});
sub.ready();
},
function(error) {
Meteor._debug( "Error doing aggregation: " + error);
}
)
);
});
Vì vậy, bạn xác định một tập hợp cho đầu ra của tập hợp và trong một quy trình như thế này, sau đó bạn xuất bản dịch vụ mà bạn cũng sẽ đăng ký trong ứng dụng khách của mình.
Bên trong này, tập hợp được chạy và đưa vào tập hợp khác (về mặt logic vì nó không thực sự viết bất cứ điều gì). Vì vậy, sau đó bạn sử dụng bộ sưu tập đó trên máy khách với cùng một định nghĩa và tất cả các kết quả tổng hợp chỉ được trả về.
Tôi thực sự có một ứng dụng ví dụ hoạt động đầy đủ của một quy trình tương tự trong câu hỏi này , cũng như việc sử dụng tổng hợp các vụ tấn công sao băng gói trên câu hỏi này ở đây, nếu bạn cần tham khảo thêm.