Vì bạn cần tính toán số lượng email được trao đổi giữa 2 địa chỉ, sẽ là công bằng nếu chiếu một between
trường như sau:
db.a.aggregate([
{ $match: {
to: { $exists: true },
from: { $exists: true },
email: { $exists: true }
}},
{ $project: {
between: { $cond: {
if: { $lte: [ { $strcasecmp: [ "$to", "$from" ] }, 0 ] },
then: [ { $toLower: "$to" }, { $toLower: "$from" } ],
else: [ { $toLower: "$from" }, { $toLower: "$to" } ] }
}
}},
{ $group: {
"_id": "$between",
"count": { $sum: 1 }
}},
{ $sort :{ count: -1 } }
])
Logic hợp nhất nên khá rõ ràng từ ví dụ:nó là một mảng được sắp xếp theo thứ tự bảng chữ cái của cả hai email. $match
và $toLower
các phần là tùy chọn nếu bạn tin tưởng vào dữ liệu của mình.
Tài liệu cho các toán tử được sử dụng trong ví dụ: