Để lấy danh sách giá trị (chỉ các giá trị thuần túy, không phải object JSON đầy đủ) từ các tài liệu thỏa mãn điều kiện (ví dụ: Value > 50), bạn có thể kết hợp distinct() để lấy mảng _id rồi dùng $in để truy xuất, hoặc dùng Aggregation Pipeline với $match và $project.
1. Tạo bộ sưu tập và chèn dữ liệu
> db.demo50.save({ "Value": 40 });
> db.demo50.save({ "Value": 100 });
> db.demo50.save({ "Value": 20 });
> db.demo50.save({ "Value": 510 });
2. Xem dữ liệu
> db.demo50.find();
Kết quả:
{ "_id": ObjectId("..."), "Value": 40 }
{ "_id": ObjectId("..."), "Value": 100 }
{ "_id": ObjectId("..."), "Value": 20 }
{ "_id": ObjectId("..."), "Value": 510 }
3. Cách 1: Dùng distinct() + $in (như ví dụ gốc)
> var listOfValues = db.demo50.distinct("_id", { Value: { $gt: 50 } });
[ ObjectId("..."), ObjectId("...") ]
> db.demo50.find({ _id: { $in: listOfValues } });
Kết quả trả về toàn bộ tài liệu (object JSON).
4. Cách 2: Chỉ lấy mảng giá trị Value (Aggregation - khuyến nghị)
> db.demo50.aggregate([
{ $match: { Value: { $gt: 50 } } },
{ $group: { _id: null, values: { $push: "$Value" } } },
{ $project: { _id: 0, values: 1 } }
]);
Kết quả:
{ "values": [ 100, 510 ] }
So sánh:
- Cách 1: Trả về mảng tài liệu đầy đủ (có _id, Value).
- Cách 2: Trả về mảng chỉ chứa giá trị
Valuethuần túy - phù hợp hơn cho biểu đồ, báo cáo.