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

Truy vấn MongoDB chỉ trả về tài liệu nhúng (embedded document)

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.