Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MongoDB

Cách chỉ trả về giá trị của một trường trong MongoDB

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ểmNhược điểmPhù hợp
find() + forEachĐơn giản trong shellChỉ dùng trong shell, load all vào RAMAd-hoc query trong shell
Aggregation $projectTrả về cursor, dùng được trong driverVẫn trả về object { field: value }Application code
Aggregation $group + $pushTrả về mảng thuần túyGiới hạn 16MB document sizeCần mảng giá trị
distinct()Tự động loại trùng, nhanhChỉ lấy unique valuesCần giá trị không trùng

Khuyến nghị

  • Trong application: dùng Aggregation $project hoặc distinct()
  • Trong mongo shell ad-hoc: forEach hoặc distinct()
  • Dataset lớn: tránh $push all vào một document (lỗi 16MB)