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

Lọc sub-document trong MongoDB

Để 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: $unwind phân tách mảng details thành các tài liệu riêng, $match lọ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: $unwind biến mỗi phần tử mảng thành 1 tài liệu riêng (giữ _id gốc). $match sau đó 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 $group gom lại: { $group: { _id: "$_id", details: { $push: "$details" } } }. Hoặc dùng $filter trong $project (MongoDB 3.2+) để lọc mảng mà không unwind.