Kể từ Meteor 0.6.5, API thu thập chưa hỗ trợ các truy vấn tổng hợp vì không có cách (đơn giản) nào để cập nhật trực tiếp chúng. Tuy nhiên, bạn vẫn có thể tự viết chúng và cung cấp chúng trong Meteor.publish
, mặc dù kết quả sẽ là tĩnh. Theo ý kiến của tôi, làm theo cách này vẫn thích hợp hơn vì bạn có thể hợp nhất nhiều tập hợp và sử dụng API thu thập phía máy khách.
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);
}
)
);
});
Trên đây là một ví dụ về tổng hợp nhóm / số lượng. Một số điều cần lưu ý:
- Khi bạn làm điều này, tự nhiên bạn sẽ thực hiện tổng hợp trên
server_collection_name
và đẩy kết quả vào một bộ sưu tập khác được gọi làclient_collection_name
. - Đăng ký này sẽ không hoạt động và có thể sẽ được cập nhật bất cứ khi nào các đối số thay đổi, vì vậy, chúng tôi sử dụng một vòng lặp thực sự đơn giản chỉ đẩy tất cả kết quả ra ngoài.
- Kết quả tổng hợp không có Mongo ObjectID, vì vậy, chúng tôi tạo một số ID tùy ý của riêng mình.
- Việc gọi lại tập hợp cần được bao bọc trong một Sợi. Tôi sử dụng
Meteor.bindEnvironment
ở đây nhưng người ta cũng có thể sử dụngFuture
để kiểm soát mức độ thấp hơn.
Nếu bạn bắt đầu kết hợp các kết quả của các ấn phẩm như thế này, bạn sẽ cần phải xem xét cẩn thận cách các id được tạo ngẫu nhiên tác động đến hộp hợp nhất. Tuy nhiên, việc triển khai đơn giản đây chỉ là một truy vấn cơ sở dữ liệu tiêu chuẩn, ngoại trừ việc sử dụng với phía máy khách Meteor APIs sẽ thuận tiện hơn.
Phiên bản TL; DR :Hầu như bất cứ lúc nào bạn đẩy dữ liệu ra khỏi máy chủ, hãy publish
thích hợp hơn phương thức method
.
Để biết thêm thông tin về các cách khác nhau để tổng hợp, hãy xem bài đăng này .