MapReduce và thực hiện nó ở phía máy khách sẽ quá chậm - bạn nên sử dụng khung tổng hợp (mới trong MongoDB 2.2).
Nó có thể trông giống như sau:
db.collection.aggregate([
{ $match : { "tags": { "$in": ["bar", "hello"] } } },
{ $unwind : "$tags" },
{ $match : { "tags": { "$in": ["bar", "hello"] } } },
{ $group : { _id: "$title", numRelTags: { $sum:1 } } },
{ $sort : { numRelTags : -1 } }
// optionally
, { $limit : 10 }
])
Lưu ý rằng các thành viên đường ống thứ nhất và thứ ba trông giống hệt nhau, điều này là có chủ đích và cần thiết. Đây là những gì các bước thực hiện:
- chỉ chuyển những tài liệu có thẻ "bar" hoặc "hello" trong đó.
- giải phóng mảng thẻ (nghĩa là chia thành một tài liệu cho mỗi phần tử thẻ
- chỉ chuyển chính xác các thẻ "bar" hoặc "hello" (tức là loại bỏ phần còn lại của các thẻ)
- nhóm theo tiêu đề (cũng có thể là "$ _id" hoặc bất kỳ sự kết hợp nào khác của tài liệu gốc thêm vào số lượng thẻ (của "bar" và "hello") mà nó có
- sắp xếp theo thứ tự giảm dần theo số lượng thẻ có liên quan
- (tùy chọn) giới hạn nhóm được trả về ở mức 10 đầu.