Bạn chắc chắn có thể làm được điều này. Tôi sẽ giải quyết từng câu hỏi của bạn:
1.Bạn có thể chỉ định một truy vấn cùng với thu nhỏ bản đồ, bộ lọc tập hợp các đối tượng sẽ được chuyển vào giai đoạn bản đồ. Trong trình bao mongo, điều này sẽ giống như thế này (giả sử là m
và r
là tên của hàm ánh xạ và hàm rút gọn của bạn, tương ứng):
> db.coll.mapReduce(m, r, {query: {$or: [{"recently-voted": true}, {"hourly-score": {$gt: 0}}]}})
2.Bước # 1 sẽ cho phép bạn sử dụng trình ánh xạ của mình trên tất cả các tài liệu với ít nhất một phiếu bầu trong giờ qua (hoặc với recently-voted
đặt thành true), nhưng không phải tất cả các phiếu bầu sẽ có trong giờ trước. Vì vậy, bạn sẽ cần lọc danh sách trong trình ánh xạ của mình và chỉ gửi những phiếu bầu bạn muốn đếm:
function m() {
var hour_ago = new Date() - 3600000;
this.votes.forEach(function (vote) {
if (vote.ts > hour_ago) {
emit(/* your key */, this.vote.a);
}
});
}
Và để giảm:
function r(key, values) {
var sum = 0;
values.forEach(function(value) { sum += value; });
return sum;
}
3.Để cập nhật bảng điểm hàng giờ, bạn có thể sử dụng reduceOutput
tùy chọn map-Reduce, sẽ gọi bộ giảm thiểu của bạn với cả giá trị được phát ra và giá trị đã lưu trước đó trong bộ sưu tập đầu ra, (nếu có). Kết quả của lần vượt qua đó sẽ được lưu vào bộ sưu tập đầu ra. Điều này trông giống như:
> db.coll.mapReduce(m, r, {query: ..., out: {reduce: "output_coll"}})
Ngoài việc giảm đầu ra, bạn có thể sử dụng merge
sẽ ghi đè tài liệu trong bộ sưu tập đầu ra bằng những tài liệu mới được tạo (nhưng để lại bất kỳ tài liệu nào có _id
khác với _id
được tạo bởi công việc m-r của bạn), replace
, đây thực sự là hoạt động thả và tạo và là hoạt động mặc định hoặc sử dụng {inline: 1}
, sẽ trả về kết quả trực tiếp cho trình bao hoặc trình điều khiển của bạn. Lưu ý rằng khi sử dụng {inline: 1}
, kết quả của bạn phải vừa với kích thước được phép cho một tài liệu (16MB trong các bản phát hành MongoDB gần đây).
(4.) Bạn có thể chạy các công việc thu nhỏ bản đồ trên các công việc thứ hai ("nô lệ"), nhưng vì các công việc thứ hai không thể chấp nhận ghi (đó là điều khiến chúng trở thành thứ yếu), bạn chỉ có thể thực hiện việc này khi sử dụng đầu ra nội tuyến.