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

วิธีหาค่าที่ซ้ำกัน (Non-Distinct) ในฟิลด์ของ MongoDB ด้วย Aggregation

ใช้ Aggregation Pipeline กับ $group และ $match เพื่อหาค่าฟิลด์ที่ปรากฏซ้ำ (Non-distinct values)

รูปแบบ Pipeline

db.collection.aggregate([
    { $group: { _id: "$fieldName", count: { $sum: 1 } } },
    { $match: { count: { $gt: 1 } } }
])

ตัวอย่างเต็มรูปแบบ

1. สร้างข้อมูลตัวอย่าง (มี UserName ซ้ำ)

> db.findAllNonDistinctDemo.insertOne({"UserName":"John","UserAge":28});
> db.findAllNonDistinctDemo.insertOne({"UserName":"Larry","UserAge":21});
> db.findAllNonDistinctDemo.insertOne({"UserName":"Larry","UserAge":23});
> db.findAllNonDistinctDemo.insertOne({"UserName":"David","UserAge":22});
> db.findAllNonDistinctDemo.insertOne({"UserName":"John","UserAge":26});
> db.findAllNonDistinctDemo.insertOne({"UserName":"Robert","UserAge":24});
> db.findAllNonDistinctDemo.insertOne({"UserName":"Robert","UserAge":25});
> db.findAllNonDistinctDemo.insertOne({"UserName":"Mike","UserAge":29});

2. แสดงข้อมูลทั้งหมด

> db.findAllNonDistinctDemo.find().pretty();

3. Aggregation หาค่าซ้ำ

> db.findAllNonDistinctDemo.aggregate([
    { $group: { _id: "$UserName", Counter: { $sum: 1 } } },
    { $match: { Counter: { $gt: 1 } } }
]).pretty();

4. ผลลัพธ์: เฉพาะชื่อที่ซ้ำ

{ "_id" : "Robert", "Counter" : 2 }
{ "_id" : "Larry", "Counter" : 2 }
{ "_id" : "John", "Counter" : 2 }

คำอธิบาย Stage

ขยายต่อ: ดูเอกสารเต็มของค่าที่ซ้ำ

db.findAllNonDistinctDemo.aggregate([
    { $group: { _id: "$UserName", docs: { $push: "$$ROOT" }, count: { $sum: 1 } } },
    { $match: { count: { $gt: 1 } } },
    { $unwind: "$docs" },
    { $replaceRoot: { newRoot: "$docs" } }
]);

สรุป

  • ใช้ $group + $sum: 1 นับจำนวน
  • ใช้ $match กรอง count > 1
  • ผลลัพธ์แสดง _id = ค่าฟิลด์, Counter = จำนวนครั้งที่ซ้ำ
  • ใช้ได้กับฟิลด์ประเภทไหนก็ได้ (string, number, date)
Stageหน้าที่
$groupจัดกลุ่มตาม UserName นับจำนวนด้วย $sum: 1
$matchกรองเฉพาะกลุ่มที่ Counter > 1 (ซ้ำ)