Giới thiệu
Để chỉ lấy giá trị của một trường cụ thể (không lấy _id và các trường khác), bạn có thể dùng projection trong find() kết hợp với forEach, hoặc dùng aggregation với $project.
Phương pháp 1: find() + forEach (Mongo Shell)
1. Tạo dữ liệu
> db.layGiaTriTruong.insertOne({"TenKhachHang":"Larry"});
{ "acknowledged" : true, "insertedId" : ObjectId("5c9ea537d628fa4220163b6e") }
> db.layGiaTriTruong.insertOne({"TenKhachHang":"Chris"});
{ "acknowledged" : true, "insertedId" : ObjectId("5c9ea53bd628fa4220163b6f") }
> db.layGiaTriTruong.insertOne({"TenKhachHang":"Robert"});
{ "acknowledged" : true, "insertedId" : ObjectId("5c9ea541d628fa4220163b70") }
> db.layGiaTriTruong.insertOne({"TenKhachHang":"Ramit"});
{ "acknowledged" : true, "insertedId" : ObjectId("5c9ea549d628fa4220163b71") }
2. Dùng forEach để push vào mảng
> var ketQua = [];
> db.layGiaTriTruong.find().forEach(function(doc) {
ketQua.push(doc.TenKhachHang);
});
3. In kết quả
> ketQua;
[ "Larry", "Chris", "Robert", "Ramit" ]
Phương pháp 2: Aggregation $project (Hiệu quả hơn, trả về cursor)
db.layGiaTriTruong.aggregate([
{ $project: { _id: 0, TenKhachHang: 1 } }
]);
Kết quả:
{ "TenKhachHang" : "Larry" }
{ "TenKhachHang" : "Chris" }
{ "TenKhachHang" : "Robert" }
{ "TenKhachHang" : "Ramit" }
Phương pháp 3: Chỉ lấy mảng giá trị thuần túy (Aggregation)
db.layGiaTriTruong.aggregate([
{ $group: { _id: null, cacGiaTri: { $push: "$TenKhachHang" } } },
{ $project: { _id: 0, cacGiaTri: 1 } }
]);
Kết quả:
{ "cacGiaTri" : [ "Larry", "Chris", "Robert", "Ramit" ] }
Phương pháp 4: distinct() (Chỉ lấy giá trị duy nhất)
> db.layGiaTriTruong.distinct("TenKhachHang");
[ "Larry", "Chris", "Robert", "Ramit" ]
So sánh các phương pháp
| Phương pháp | Ưu điểm | Nhược điểm | Phù hợp |
|---|---|---|---|
| find() + forEach | Đơn giản trong shell | Chỉ dùng trong shell, load all vào RAM | Ad-hoc query trong shell |
| Aggregation $project | Trả về cursor, dùng được trong driver | Vẫn trả về object { field: value } | Application code |
| Aggregation $group + $push | Trả về mảng thuần túy | Giới hạn 16MB document size | Cần mảng giá trị |
| distinct() | Tự động loại trùng, nhanh | Chỉ lấy unique values | Cần giá trị không trùng |
Khuyến nghị
- Trong application: dùng Aggregation
$projecthoặcdistinct() - Trong mongo shell ad-hoc:
forEachhoặcdistinct() - Dataset lớn: tránh $push all vào một document (lỗi 16MB)