Để gom nhóm và thu thập giá trị vào mảng (loại trùng lặp), sử dụng $addToSet trong pipeline aggregate().
Tạo collection dữ liệu
> db.demo498.insertOne({id:1, Name:["Chris"]});
> db.demo498.insertOne({id:2, Name:["David"]});
> db.demo498.insertOne({id:3, Name:["Chris"]});
> db.demo498.insertOne({id:4, Name:["Bob"]});
> db.demo498.insertOne({id:5, Name:["David"]});
Hiển thị dữ liệu gốc
> db.demo498.find();
Kết quả: 5 document, Name là mảng 1 phần tử
Aggregate group by Name, collect id vào mảng
> db.demo498.aggregate([
{ $unwind: "$Name" },
{
$group: {
_id: "$Name",
Id: { $addToSet: "$id" }
}
}
])
Kết quả (gom theo tên, thu thập id duy nhất):
{
"_id" : "David", "Id" : [ 5, 2 ]
}
{
"_id" : "Bob", "Id" : [ 4 ]
}
{
"_id" : "Chris", "Id" : [ 3, 1 ]
}
Giải thích:
$unwind: "$Name": Phân rã mảng Name (mỗi document có 1 phần tử) → 5 document phẳng$grouptheo_id: "$Name": Gom các document cùng tên$addToSet: "$id": Thu thậpidvào mảng, **tự động loại trùng lặp** (Set semantics)
So sánh $push vs $addToSet:
$push:Id: [2, 5, 2](giữ trùng, giữ thứ tự)$addToSet:Id: [5, 2](loại trùng, thứ tự không đảm bảo)
Ứng dụng: Xây dựng inverted index, tagging system, phân quyền user-role, distinct values per group.