นับจำนวนค่าที่ซ้ำกันในอาร์เรย์ด้วย Aggregate Pipeline
บทความนี้สาธิตวิธีการนับจำนวนครั้งที่ค่าเฉพาะ (เช่น "Robert") ปรากฏในอาร์เรย์ภายในเอกสาร โดยใช้ Aggregation Pipeline: $match, $unwind, $match, $group, $match
ขั้นตอนที่ 1: สร้าง Collection และเพิ่มข้อมูลตัวอย่าง
สร้าง collection ชื่อ demo210 มีฟิลด์ details เป็นอาร์เรย์ของออบเจกต์ที่มี ClientName
> db.demo210.insertOne({
"details": [
{ "ClientName": "Robert" },
{ "ClientName": "John Doe" },
{ "ClientName": "Robert" },
{ "ClientName": "Robert" },
{ "ClientName": "David Miller" }
]
});
{ "acknowledged": true, "insertedId": ObjectId("5e3d99ab03d395bdc21346f9") }
ขั้นตอนที่ 2: แสดงข้อมูลทั้งหมด
> db.demo210.find();
ผลลัพธ์:
{ "_id": ObjectId("5e3d99ab03d395bdc21346f9"), "details": [
{ "ClientName": "Robert" },
{ "ClientName": "John Doe" },
{ "ClientName": "Robert" },
{ "ClientName": "Robert" },
{ "ClientName": "David Miller" }
] }
ขั้นตอนที่ 3: Aggregation Pipeline นับจำนวน "Robert"
$match- กรองเอกสารที่มี "Robert" อยู่ใน details.ClientName (ลดข้อมูลก่อน unwind)$unwind: "$details"- แยกอาร์เรย์ details$match- กรองเฉพาะรายการที่ ClientName = "Robert"$group- จัดกลุ่มตาม _id และนับจำนวนด้วย$sum: 1$match- กรองเฉพาะกลุ่มที่มีจำนวนมากกว่าหรือเท่ากับ 2 ($gte: 2)
> db.demo210.aggregate([
{ "$match": { "details.ClientName": "Robert" } },
{ "$unwind": "$details" },
{ "$match": { "details.ClientName": "Robert" } },
{ "$group": { "_id": "$_id", "Size": { "$sum": 1 } } },
{ "$match": { "Size": { "$gte": 2 } } }
]);
ผลลัพธ์ที่ได้
{ "_id": ObjectId("5e3d99ab03d395bdc21346f9"), "Size": 3 }
สรุป: Pipeline นี้แสดงวิธีการนับความถี่ของค่าในอาร์เรย์ภายในเอกสาร และสามารถกรองเพิ่มเติมได้ เช่น เอาเฉพาะที่มีจำนวนมากกว่าเกณฑ์ที่กำหนด