Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MongoDB

Distinct หลายฟิลด์พร้อมกันใน MongoDB ด้วย Aggregation $group และ $addToSet

เมธอด distinct() รองรับฟิลด์เดียวเท่านั้น สำหรับ Distinct หลายฟิลด์พร้อมกัน ต้องใช้ Aggregation Pipeline ด้วย $group และ $addToSet

สร้างคอลเลกชันและข้อมูลตัวอย่าง

> db.distinctOnMultipleFieldsDemo.insertOne({"StudentFirstName":"Chris","StudentAge":21,"StudentCountryName":"US"});
{ "acknowledged": true, "insertedId": ObjectId("5cd2e518b64f4b851c3a13d7") }
> db.distinctOnMultipleFieldsDemo.insertOne({"StudentFirstName":"Robert","StudentAge":21,"StudentCountryName":"AUS"});
{ "acknowledged": true, "insertedId": ObjectId("5cd2e518b64f4b851c3a13d8") }
> db.distinctOnMultipleFieldsDemo.insertOne({"StudentFirstName":"Chris","StudentAge":22,"StudentCountryName":"UK"});
{ "acknowledged": true, "insertedId": ObjectId("5cd2e518b64f4b851c3a13d9") }
> db.distinctOnMultipleFieldsDemo.insertOne({"StudentFirstName":"David","StudentAge":24,"StudentCountryName":"AUS"});
{ "acknowledged": true, "insertedId": ObjectId("5cd2e518b64f4b851c3a13da") }

แสดงข้อมูลทั้งหมด

> db.distinctOnMultipleFieldsDemo.find().pretty();

ผลลัพธ์: 4 เอกสาร

Aggregation: Distinct 3 ฟิลด์พร้อมกัน

> db.distinctOnMultipleFieldsDemo.aggregate([
  {
    $group: {
      _id: 0,
      StudentFirstName: {$addToSet: '$StudentFirstName'},
      StudentAge: {$addToSet: '$StudentAge'},
      StudentCountryName: {$addToSet: '$StudentCountryName'}
    }
  }
]);

ผลลัพธ์: ค่าที่ไม่ซ้ำของแต่ละฟิลด์ในเอกสารเดียว

{
  "_id": 0,
  "StudentFirstName": ["David", "Robert", "Chris"],
  "StudentAge": [24, 22, 21],
  "StudentCountryName": ["UK", "AUS", "US"]
}

การทำงานของ $addToSet

  • สร้าง Array ของค่า Unique (ไม่ซ้ำ) สำหรับแต่ละฟิลด์
  • ลำดับใน Array ไม่ได้รับประกัน
  • _id: 0 หมายถึง Group ทั้งหมดเป็นกลุ่มเดียว (Global Group)

รูปแบบอื่น: Distinct Combination (คู่ค่าที่ไม่ซ้ำ)

หากต้องการคู่ (Name, Age) ที่ไม่ซ้ำ:

db.distinctOnMultipleFieldsDemo.aggregate([
  {$group: {_id: {name: "$StudentFirstName", age: "$StudentAge"}}},
  {$project: {_id: 0, name: "$_id.name", age: "$_id.age"}}
]);

ผลลัพธ์:

{"name": "Chris", "age": 21}
{"name": "Robert", "age": 21}
{"name": "Chris", "age": 22}
{"name": "David", "age": 24}

สรุปเทคนิค

ความต้องการวิธีทำ
Distinct 1 ฟิลด์db.coll.distinct("field")
Distinct หลายฟิลด์ แยกกัน$group + $addToSet (ตัวอย่างข้างต้น)
Distinct Combination (Tuple)$group _id: {f1: "$f1", f2: "$f2"}
นับ Distinct Count$group + $sum: 1 หรือ $addToSet + $size