MongoDB không thể chỉ trả về tài liệu nhúng đơn lẻ; nó luôn trả về toàn bộ tài liệu cha (root document). Tuy nhiên, bạn có thể dùng projection để chỉ lấy trường nhúng mong muốn.
Ví dụ: Collection queryToEmbeddedDocument có mảng PostDetails chứa các đối tượng nhúng:
> db.queryToEmbeddedDocument.insertOne({
"UserName": "Larry",
"PostDetails": [
{"UserMessage": "Hello", "UserLikes": 8},
{"UserMessage": "Hi", "UserLikes": 6},
{"UserMessage": "Good Morning", "UserLikes": 12},
{"UserMessage": "Awesome", "UserLikes": 4}
]
});
Truy vấn với điều kiện UserLikes >= 8 và projection chỉ lấy PostDetails:
> db.queryToEmbeddedDocument.find(
{"PostDetails.UserLikes": { $gte: 8 }},
{PostDetails: 1}
).pretty();
Kết quả vẫn trả về toàn bộ mảng PostDetails (kể cả các phần tử không thỏa điều kiện), vì MongoDB không lọc phần tử bên trong mảng ở cấp độ truy vấn find().
Giải pháp: Để lọc phần tử trong mảng, dùng Aggregation Pipeline với $unwind và $match, hoặc $filter (MongoDB 3.2+).
Ví dụ aggregation:
db.queryToEmbeddedDocument.aggregate([
{ $unwind: "$PostDetails" },
{ $match: { "PostDetails.UserLikes": { $gte: 8 } } },
{ $group: { _id: "$_id", UserName: { $first: "$UserName" }, PostDetails: { $push: "$PostDetails" } } }
]);
Cách này trả về tài liệu chỉ chứa các phần tử thỏa mãn điều kiện.