Nếu bạn đang sử dụng tổng hợp sao băng
gói để triển khai .aggregate()
trên bộ sưu tập của bạn, sau đó nó sẽ chỉ trả về một mảng để phản hồi. Vì vậy, bạn cần biến nó thành một dạng tuyển tập đã xuất bản:
Meteor.publish("completedLB,function() {
var self = this;
var results = userCompleted.aggregate([
{ "$match": { "progressState": true } },
{ "$group": {
"_id": "$userId",
"progressState": { "$first": "$progressState" },
"count": { "$sum": 1 }
}},
{ "$sort": { "_id": 1 } }
]);
_.each(results,function(result) {
self.added("client_collection_name",Random.id(), {
userId: result._id,
progressState: result.progressState,
count: result.count
});
});
self.ready();
});
Hoặc bao gồm false
được tính là đầu ra được đề xuất của bạn tự gợi ý:
{ "$group": {
"_id": "$userId",
"progressState": { "$first": true },
"count": { "$sum": { "$cond": ["$progressState", 1,0] }
}},
{ "$sort": { "_id": 1 } }
Là đường dẫn với $cond
đánh giá để chuyển đổi thành số.
Trong tập hợp cơ bản, bạn chỉ "tính tổng" các kết quả phù hợp và tất nhiên là $sort
đề cập đến một trường có trong đầu ra, theo ví dụ của bạn sẽ là giá trị "userId" bây giờ trong _id
từ tổng hợp, nhưng cũng có thể là "đếm" để sắp xếp theo tổng số nếu muốn.
Phần đó đang tạo ra lỗi, là $sort
là một trường hiện tại và không phải là một giá trị trường với $
ký hiệu.
Nhưng tất nhiên để xuất bản dưới dạng một bộ sưu tập có thể truy cập được từ ứng dụng khách, bạn cần phải thay thế _id
thực tế với một cái gì đó được mong đợi. Vì vậy, việc tạo id ngẫu nhiên hoạt động ở đây, cũng như việc bao gồm các trường khác.
Để biết thêm một chút chi tiết, và cũng là một gói thay thế cho gói "hack" chỉ hoạt động với cài đặt vani, còn có câu trả lời này bản thân tôi có một danh sách đầy đủ làm ví dụ.