Double $group để đếm distinct theo nhóm
Sử dụng 2 stage $group: stage 1 nhóm theo cặp trường (tạo distinct), stage 2 nhóm theo trường đầu và đếm.
Dữ liệu tên
> db.demo354.insertOne({"Name1": "Chris", "Name2": "David"});
> db.demo354.insertOne({"Name1": "Chris", "Name2": "David"});
> db.demo354.insertOne({"Name1": "Chris", "Name2": "Bob"});
> db.demo354.insertOne({"Name1": "Carol", "Name2": "John"});
> db.demo354.insertOne({"Name1": "Carol", "Name2": "John"});
Pipeline đếm unique Name2 theo Name1
> db.demo354.aggregate([
{
$group: {
_id: { "Name1": "$Name1", "Name2": "$Name2" }
}
},
{
$group: {
_id: "$_id.Name1",
"Name2": { $sum: 1 }
}
},
{
$project: {
_id: 0,
Name1: "$_id",
Name2: 1
}
}
]);
Kết quả
{ "Name2": 2, "Name1": "Chris" } // David, Bob
{ "Name2": 1, "Name1": "Carol" } // John
Logic: Stage 1 tạo distinct cặp (Name1, Name2). Stage 2 nhóm theo Name1 và đếm số cặp distinct. Stage 3 format output.
MongoDB 4.4+: Dùng $setUnion hoặc $addToSet trong $group đơn lẻ.