หากต้องการนับรายการที่ไม่ซ้ำกัน (unique items) ในฟิลด์ที่เป็นอาร์เรย์ ให้ใช้ขั้นตอน $group ร่วมกับเมธอด aggregate() มาสร้างคอลเลกชันพร้อมเอกสารตัวอย่างกันก่อน
> db.demo493.insertOne({"SubjectName":["MySQL","MongoDB","Java"]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e849f97b0f3fa88e22790c4") }
> db.demo493.insertOne({"SubjectName":["C++","MongoDB","C"]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e849fa4b0f3fa88e22790c5") }
> db.demo493.insertOne({"SubjectName":["MySQL","MongoDB","C"]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e849fb2b0f3fa88e22790c6") }
แสดงเอกสารทั้งหมดในคอลเลกชันด้วยเมธอด find():
> db.demo493.find();
ผลลัพธ์ที่ได้:
{ "_id" : ObjectId("5e849f97b0f3fa88e22790c4"), "SubjectName" : [ "MySQL", "MongoDB", "Java" ] }
{ "_id" : ObjectId("5e849fa4b0f3fa88e22790c5"), "SubjectName" : [ "C++", "MongoDB", "C" ] }
{ "_id" : ObjectId("5e849fb2b0f3fa88e22790c6"), "SubjectName" : [ "MySQL", "MongoDB", "C" ] }
คิวรีสำหรับนับรายการที่ไม่ซ้ำกันในฟิลด์อาร์เรย์ทั่วทุกเอกสาร
> db.demo493.aggregate([
... { $unwind: "$SubjectName" },
... { $group: { _id: "$SubjectName", Frequency: { $sum : 1 } } }
... ]);
ผลลัพธ์จะแสดงแต่ละวิชาพร้อมจำนวนครั้งที่ปรากฏ (ความถี่):
{ "_id" : "C++", "Frequency" : 1 }
{ "_id" : "C", "Frequency" : 2 }
{ "_id" : "Java", "Frequency" : 1 }
{ "_id" : "MySQL", "Frequency" : 2 }
{ "_id" : "MongoDB", "Frequency" : 3 }
คำอธิบายขั้นตอนการทำงาน
- $unwind: แยกอาร์เรย์
SubjectNameให้แต่ละสมาชิกกลายเป็นเอกสารแยกต่างหาก - $group: จัดกลุ่มตามชื่อวิชา (
_id: "$SubjectName") และนับจำนวนด้วย$sum: 1
วิธีนี้เหมาะสำหรับการวิเคราะห์ข้อมูลในฟิลด์อาร์เรย์ เช่น การนับแท็ก, หมวดหมู่, หรือรายการที่ซ้ำกันในหลายเอกสาร