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

การนับจำนวนค่าเฉพาะในอาร์เรย์ของ MongoDB ด้วย Aggregation

นับจำนวนค่าที่ซ้ำกันในอาร์เรย์ด้วย 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"

  1. $match - กรองเอกสารที่มี "Robert" อยู่ใน details.ClientName (ลดข้อมูลก่อน unwind)
  2. $unwind: "$details" - แยกอาร์เรย์ details
  3. $match - กรองเฉพาะรายการที่ ClientName = "Robert"
  4. $group - จัดกลุ่มตาม _id และนับจำนวนด้วย $sum: 1
  5. $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 นี้แสดงวิธีการนับความถี่ของค่าในอาร์เรย์ภายในเอกสาร และสามารถกรองเพิ่มเติมได้ เช่น เอาเฉพาะที่มีจำนวนมากกว่าเกณฑ์ที่กำหนด