ใช้ 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
| Stage | หน้าที่ |
|---|---|
$group | จัดกลุ่มตาม UserName นับจำนวนด้วย $sum: 1 |
$match | กรองเฉพาะกลุ่มที่ Counter > 1 (ซ้ำ) |