ใช้ Aggregation Framework นับความถี่และหาค่าที่มากที่สุด
เมื่อต้องการทราบว่าในอาร์เรย์ของหลายเอกสาร ค่าไหนปรากฏบ่อยที่สุด ใช้ Pipeline: $unwind → $group → $sort → $limit
ตัวอย่างข้อมูล: วิชาที่นักเรียนเรียน
> db.topCountArrayDemo.insertOne({"StudentId":101, "StudentSubject":["C", "MongoDB"]});
> db.topCountArrayDemo.insertOne({"StudentId":102, "StudentSubject":["C", "Java"]});
> db.topCountArrayDemo.insertOne({"StudentId":103, "StudentSubject":["C", "MongoDB"]});
Pipeline หา 2 วิชาที่นิยมมากที่สุด
> db.topCountArrayDemo.aggregate([
{ $unwind: "$StudentSubject" }, // แบนอาร์เรย์: 1 วิชา = 1 เอกสาร
{ $group: { _id: "$StudentSubject", Frequency: { $sum: 1 } } }, // นับจำนวน
{ $sort: { Frequency: -1 } }, // เรียงมากไปน้อย
{ $limit: 2 } // เอา 2 อันแรก
]).pretty();
ผลลัพธ์
{ "_id" : "C", "Frequency" : 3 }
{ "_id" : "MongoDB", "Frequency" : 2 }
คำอธิบาย
- วิชา C ปรากฏในทุกเอกสาร (3 ครั้ง)
- วิชา MongoDB ปรากฏ 2 ครั้ง
- วิชา Java ปรากฏ 1 ครั้ง (ไม่เข้าทอป 2)
การประยุกต์ใช้
- หา Tag/Hashtag ยอดนิยม
- วิเคราะห์สินค้าที่มักซื้อร่วมกัน
- ตรวจจับค่าผิดปกติ (Anomaly Detection) จากความถี่