Hãy tạo một collection với các tài liệu mẫu:
> db.demo187.insertOne(
{
"_id" : "101",
"Details" : [
{ "Subject" : "MongoDB" },
{ "Subject" : "MySQL" }
]
}
);
{ "acknowledged" : true, "insertedId" : "101" }
> db.demo187.insertOne(
{
"_id" : "102",
"Details" : [
{ }
]
}
);
{ "acknowledged" : true, "insertedId" : "102" }
> db.demo187.insertOne(
{
"_id" : "103",
"Details" : [
{ "Subject" : "MongoDB" },
{ "Subject" : "MySQL" }
]
}
);
{ "acknowledged" : true, "insertedId" : "103" }
Hiển thị tất cả tài liệu từ collection bằng phương thức find():
> db.demo187.find();
Kết quả đầu ra:
{ "_id" : "101", "Details" : [ { "Subject" : "MongoDB" }, { "Subject" : "MySQL" } ] }
{ "_id" : "102", "Details" : [ { } ] }
{ "_id" : "103", "Details" : [ { "Subject" : "MongoDB" }, { "Subject" : "MySQL" } ]
Truy vấn sau tìm các tài liệu MongoDB có mảng lồng nhau đã điền (không rỗng):
> db.demo187.aggregate([
{$unwind: '$Details'},
{$project: {Subject: '$Details.Subject'}},
{$match: {Subject: {$exists: true}}}
])
Kết quả đầu ra - chỉ giữ lại các tài liệu có trường Subject tồn tại:
{ "_id" : "101", "Subject" : "MongoDB" }
{ "_id" : "101", "Subject" : "MySQL" }
{ "_id" : "103", "Subject" : "MongoDB" }
{ "_id" : "103", "Subject" : "MySQL" }
Giải thích: Pipeline aggregation sử dụng $unwind để phân tách mảng Details, $project để trích xuất trường Subject, và $match với $exists: true để lọc bỏ các phần tử rỗng.