Để lọc sub-document (tài liệu con) trong mảng, sử dụng MongoDB aggregation với $unwind và $match. Tạo collection:
> db.demo662.insertOne({
"details": [
{ Name: "Chris", Marks: 35 },
{ Name: "Bob", Marks: 45 },
{ Name: "David", Marks: 30 }
]
});
{ "acknowledged" : true, "insertedId" : ObjectId("5ea1b2be24113ea5458c7d04") }
Hiển thị dữ liệu:
> db.demo662.find();
Kết quả:
Pipeline:
$unwindphân tách mảng details thành các tài liệu riêng,$matchlọc Marks > 40:> db.demo662.aggregate({$unwind:"$details"},{$match:{"details.Marks":{$gt:40}}})Kết quả chỉ giữ sub-document Bob (Marks=45):
Giải thích:
$unwindbiến mỗi phần tử mảng thành 1 tài liệu riêng (giữ _id gốc).$matchsau đó lọc như bình thường. Kết quả trường details không còn là mảng mà là object đơn.Mở rộng: Để giữ cấu trúc mảng gốc, thêm
$groupgom lại:{ $group: { _id: "$_id", details: { $push: "$details" } } }. Hoặc dùng$filtertrong$project(MongoDB 3.2+) để lọc mảng mà không unwind.