Để tìm các giá trị xuất hiện nhiều lần (non-distinct) của một trường, dùng Aggregation Pipeline với $group và $match.
Ví dụ: Collection findAllNonDistinctDemo:
> 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});
Aggregation pipeline:
> db.findAllNonDistinctDemo.aggregate([
{ $group: { _id: "$UserName", Counter: { $sum: 1 } } },
{ $match: { Counter: { $gt: 1 } } }
]).pretty();
Kết quả:
{ "_id" : "Robert", "Counter" : 2 }
{ "_id" : "Larry", "Counter" : 2 }
{ "_id" : "John", "Counter" : 2 }
Giải thích:
$group: Nhóm theoUserName, đếm số lần xuất hiện (Counter).$match: Lọc các nhóm cóCounter > 1(xuất hiện >= 2 lần).
Cách này cho biết giá trị nào bị trùng và số lần trùng.