Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MongoDB

Lấy kết quả group by với mảng trong MongoDB ($addToSet)

Để 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:

  1. $unwind: "$Name": Phân rã mảng Name (mỗi document có 1 phần tử) → 5 document phẳng
  2. $group theo _id: "$Name": Gom các document cùng tên
  3. $addToSet: "$id": Thu thập id và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.