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

นับจำนวนค่าที่ไม่ซ้ำ (Distinct Count) ของ Array Field ใน MongoDB

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