ใช้เมธอด distinct() ร่วมกับ Property .length เพื่อนับจำนวนค่า Unique ของฟิลด์ในคอลเลกชัน
ไวยากรณ์
db.collection.distinct('fieldName').length;
สร้างคอลเลกชันและข้อมูลตัวอย่าง (มีค่าซ้ำ)
> db.countOrSizeDemo.insertOne({"StudentFirstName":"John"});
{ "acknowledged": true, "insertedId": ObjectId("5cd304f5b64f4b851c3a13dc") }
> db.countOrSizeDemo.insertOne({"StudentFirstName":"David"});
{ "acknowledged": true, "insertedId": ObjectId("5cd304fab64f4b851c3a13dd") }
> db.countOrSizeDemo.insertOne({"StudentFirstName":"David"}); // duplicate
{ "acknowledged": true, "insertedId": ObjectId("5cd304fcb64f4b851c3a13de") }
> db.countOrSizeDemo.insertOne({"StudentFirstName":"Carol"});
{ "acknowledged": true, "insertedId": ObjectId("5cd30500b64f4b851c3a13df") }
> db.countOrSizeDemo.insertOne({"StudentFirstName":"Sam"});
{ "acknowledged": true, "insertedId": ObjectId("5cd30505b64f4b851c3a13e0") }
> db.countOrSizeDemo.insertOne({"StudentFirstName":"John"}); // duplicate
{ "acknowledged": true, "insertedId": ObjectId("5cd3050ab64f4b851c3a13e1") }
แสดงข้อมูลทั้งหมด (6 เอกสาร แต่มีค่าซ้ำ)
> db.countOrSizeDemo.find();
ผลลัพธ์:
{"_id": ObjectId("5cd304f5b64f4b851c3a13dc"), "StudentFirstName": "John"}
{"_id": ObjectId("5cd304fab64f4b851c3a13dd"), "StudentFirstName": "David"}
{"_id": ObjectId("5cd304fcb64f4b851c3a13de"), "StudentFirstName": "David"}
{"_id": ObjectId("5cd30500b64f4b851c3a13df"), "StudentFirstName": "Carol"}
{"_id": ObjectId("5cd30505b64f4b851c3a13e0"), "StudentFirstName": "Sam"}
{"_id": ObjectId("5cd3050ab64f4b851c3a13e1"), "StudentFirstName": "John"}
คำสั่ง: นับจำนวนชื่อที่ไม่ซ้ำกัน (Distinct Count)
> db.countOrSizeDemo.distinct('StudentFirstName').length;
ผลลัพธ์:
4
ค่าที่ไม่ซ้ำ: John, David, Carol, Sam = 4 ค่า
การทำงาน
distinct('StudentFirstName')คืนค่า Array:["John", "David", "Carol", "Sam"].lengthนับจำนวน Element ใน Array = 4
ตัวเลือกอื่น: ใช้ Aggregation (เหมาะกับข้อมูลเยอะ)
db.countOrSizeDemo.aggregate([
{$group: {_id: "$StudentFirstName"}},
{$count: "distinctCount"}
]);
ผลลัพธ์: {"distinctCount": 4}
ข้อควรระวัง
distinct()มีขีดจำกัดผลลัพธ์ 16MB (BSON Document Size Limit)- สำหรับข้อมูลใหญ่ ใช้ Aggregation
$group+$countแทน - รองรับ Query Filter:
db.coll.distinct('field', {filter}) - ใช้กับ Array Field ได้: จะ Unwind อัตโนมัติ แล้ว Distinct ค่าใน Array