Lấy giá trị duy nhất (distinct) từ mảng object
Sử dụng phương thức distinct() kết hợp dot notation để lấy các giá trị không trùng lặp từ trường trong mảng object.
1. Dữ liệu mẫu: mảng Information chứa nhiều object
> db.demo442.insertOne({
Information: [
{ "FirstName": "John", "Age": 21 },
{ "FirstName": "Sam", "Age": 23 },
{ "FirstName": "John", "Age": 24 },
{ "FirstName": "Carol", "Age": 20 },
{ "FirstName": "Sam", "Age": 22 }
]
});
{ "acknowledged": true, "insertedId": ObjectId("5e78cf29bbc41e36cc3caeb8") }
2. Xem dữ liệu
> db.demo442.find();
{
"_id": ObjectId("5e78cf29bbc41e36cc3caeb8"),
"Information": [
{ "FirstName": "John", "Age": 21 },
{ "FirstName": "Sam", "Age": 23 },
{ "FirstName": "John", "Age": 24 },
{ "FirstName": "Carol", "Age": 20 },
{ "FirstName": "Sam", "Age": 22 }
]
}
3. Lấy distinct FirstName
> db.demo442.distinct("Information.FirstName");
4. Kết quả
[ "Carol", "John", "Sam" ]
Cách hoạt động
"Information.FirstName"dùng dot notation để "flatten" mảng- MongoDB tự động duyệt qua tất cả phần tử mảng, lấy trường
FirstName - Loại bỏ trùng lặp, trả về mảng giá trị duy nhất
Các trường hợp hữu ích khác
// Distinct Age
db.demo442.distinct("Information.Age");
// Kết quả: [20, 21, 22, 23, 24]
// Distinct với filter (MongoDB 4.4+)
db.demo442.distinct("Information.FirstName", { "Information.Age": { $gte: 22 } });
// Chỉ lấy tên của người >= 22 tuổi
Lưu ý hiệu suất
- Tạo index trên trường mảng:
db.demo442.createIndex({ "Information.FirstName": 1 }) distinctquét toàn bộ collection nếu không có index phù hợp- Giới hạn: Kết quả không vượt quá 16MB (kích thước tài liệu tối đa)