ใน MongoDB ใช้เมธอด distinct() เพื่อดึงค่าที่ไม่ซ้ำกัน (distinct values) ของฟิลด์หนึ่ง โดยสามารถระบุเงื่อนไข filter ได้ในพารามิเตอร์ที่สอง
ไวยากรณ์
db.collection.distinct("fieldName", { queryFilter })
สร้างคอลเลกชันและข้อมูลตัวอย่าง
> db.distinctNameAndAgeDemo.insertOne({"ClientFirstName":"John","Age":23});
{ "acknowledged": true, "insertedId": ObjectId("5cd12759e3526dbddbbfb60b") }
> db.distinctNameAndAgeDemo.insertOne({"ClientFirstName":"Larry","Age":25});
{ "acknowledged": true, "insertedId": ObjectId("5cd12768e3526dbddbbfb60c") }
> db.distinctNameAndAgeDemo.insertOne({"ClientFirstName":"David","Age":25});
{ "acknowledged": true, "insertedId": ObjectId("5cd12773e3526dbddbbfb60d") }
> db.distinctNameAndAgeDemo.insertOne({"ClientFirstName":"Carol","Age":26});
{ "acknowledged": true, "insertedId": ObjectId("5cd1277ee3526dbddbbfb60e") }
> db.distinctNameAndAgeDemo.insertOne({"ClientFirstName":"Sam","Age":25});
{ "acknowledged": true, "insertedId": ObjectId("5cd12793e3526dbddbbfb60f") }
> db.distinctNameAndAgeDemo.insertOne({"ClientFirstName":"Larry","Age":25}); // duplicate
{ "acknowledged": true, "insertedId": ObjectId("5cd127a3e3526dbddbbfb610") }
> db.distinctNameAndAgeDemo.insertOne({"ClientFirstName":"Carol","Age":26}); // duplicate
{ "acknowledged": true, "insertedId": ObjectId("5cd127aae3526dbddbbfb611") }
แสดงข้อมูลทั้งหมด
> db.distinctNameAndAgeDemo.find().pretty();
คำสั่ง Distinct: ค้นหาชื่อที่ไม่ซ้ำกันของคนอายุ 25 ปี
> db.distinctNameAndAgeDemo.distinct("ClientFirstName", {"Age": 25});
ผลลัพธ์:
["Larry", "David", "Sam"]
คำสั่งนี้เทียบเท่า SQL:
SELECT DISTINCT ClientFirstName FROM distinctNameAndAgeDemo WHERE Age = 25;
การทำงานของ distinct()
- สแกนเฉพาะเอกสารที่ตรงเงื่อนไข
{"Age": 25} - รวบรวมค่า
ClientFirstNameที่ไม่ซ้ำกัน - คืนค่าเป็น Array ของค่าที่ unique
- Larry ปรากฏ 2 ครั้งในข้อมูล แต่มาแค่ครั้งเดียวในผลลัพธ์
ตัวเลือกเพิ่มเติม
- ใช้ Aggregation
$group+$addToSetสำหรับ distinct หลายฟิลด์พร้อมกัน - ใช้
db.collection.distinct("field")โดยไม่มี filter เพื่อ distinct ทั้งคอลเลกชัน