เมธอด 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 |