Để lấy các giá trị duy nhất (unique/distinct) của một trường trong MongoDB, loại bỏ các bản ghi trùng lặp, bạn sử dụng phương thức distinct().
Cú pháp
db.yourCollectionName.distinct("yourFieldName");
Ví dụ minh họa
Tạo collection và dữ liệu
> db.returnOnlyUniqueValuesDemo.insertOne({"CusomerName":"Larry","CustomerAge":23});
{ "acknowledged" : true, "insertedId" : ObjectId("5c8ed7262f684a30fbdfd580") }
> db.returnOnlyUniqueValuesDemo.insertOne({"CusomerName":"Mike","CustomerAge":21});
{ "acknowledged" : true, "insertedId" : ObjectId("5c8ed72d2f684a30fbdfd581") }
> db.returnOnlyUniqueValuesDemo.insertOne({"CusomerName":"Sam","CustomerAge":21});
{ "acknowledged" : true, "insertedId" : ObjectId("5c8ed7322f684a30fbdfd582") }
> db.returnOnlyUniqueValuesDemo.insertOne({"CusomerName":"Carol","CustomerAge":25});
{ "acknowledged" : true, "insertedId" : ObjectId("5c8ed73a2f684a30fbdfd583") }
> db.returnOnlyUniqueValuesDemo.insertOne({"CusomerName":"David","CustomerAge":22});
{ "acknowledged" : true, "insertedId" : ObjectId("5c8ed74a2f684a30fbdfd584") }
> db.returnOnlyUniqueValuesDemo.insertOne({"CusomerName":"Chris","CustomerAge":23});
{ "acknowledged" : true, "insertedId" : ObjectId("5c8ed7582f684a30fbdfd585") }
Xem tất cả documents
> db.returnOnlyUniqueValuesDemo.find().pretty();
{
"_id" : ObjectId("5c8ed7262f684a30fbdfd580"),
"CusomerName" : "Larry",
"CustomerAge" : 23
}
{
"_id" : ObjectId("5c8ed72d2f684a30fbdfd581"),
"CusomerName" : "Mike",
"CustomerAge" : 21
}
{
"_id" : ObjectId("5c8ed7322f684a30fbdfd582"),
"CusomerName" : "Sam",
"CustomerAge" : 21
}
{
"_id" : ObjectId("5c8ed73a2f684a30fbdfd583"),
"CusomerName" : "Carol",
"CustomerAge" : 25
}
{
"_id" : ObjectId("5c8ed74a2f684a30fbdfd584"),
"CusomerName" : "David",
"CustomerAge" : 22
}
{
"_id" : ObjectId("5c8ed7582f684a30fbdfd585"),
"CusomerName" : "Chris",
"CustomerAge" : 23
}
Có 6 document nhưng CustomerAge chỉ có 4 giá trị distinct: 21, 22, 23, 25 (21 và 23 xuất hiện 2 lần).
Lấy unique values của CustomerAge
> db.returnOnlyUniqueValuesDemo.distinct("CustomerAge");
[ 23, 21, 25, 22 ]
Distinct với điều kiện (query filter)
// Chỉ distinct CustomerAge của những người tên bắt đầu bằng "C"
db.returnOnlyUniqueValuesDemo.distinct("CustomerAge", { CusomerName: /^C/ });
[ 21, 25 ]
Chỉ Carol (25) và Chris (23) - wait, Chris là 23. Kết quả thực tế: Carol=25, Chris=23 → [25, 23].
Distinct trên trường mảng
// Nếu tags là mảng: ["mongodb", "nosql"], ["mongodb", "database"]
db.posts.distinct("tags");
[ "mongodb", "nosql", "database" ]
distinct() tự động "flatten" mảng và lấy unique values.
Lưu ý hiệu năng
distinct()quét toàn bộ collection (collection scan) nếu không có index- Tạo index trên trường distinct để tăng tốc:
db.coll.createIndex({field: 1}) - Giới hạn kết quả: MongoDB 4.2+ hỗ trợ
maxTimeMS - Kết quả trả về là array, có thể lớn →注意内存
Thay thế bằng Aggregation (linh hoạt hơn)
db.returnOnlyUniqueValuesDemo.aggregate([
{ $group: { _id: "$CustomerAge" } },
{ $project: { _id: 0, CustomerAge: "$_id" } }
])
Cho phép thêm $match, $sort, $limit...