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

Truy vấn mảng embedded document theo khoảng (range) MongoDB

Lọc phần tử embedded document trong mảng theo range điểm số

Sử dụng aggregation pipeline với $match, $addFields, $filter để lọc phần tử mảng thỏa mãn khoảng giá trị.

Dữ liệu userDetails

> db.demo346.insertOne({
    _id: 101,
    userDetails: [
        { UserName: "Chris", Score: 78 },
        { UserName: "David", Score: 68 },
        { UserName: "Bob", Score: 88 }
    ]
});
> db.demo346.insertOne({
    _id: 102,
    userDetails: [
        { UserName: "Mike", Score: 92 },
        { UserName": "Sam", Score: 62 },
        { UserName: "Carol", Score: 97 }
    ]
});

Pipeline lọc Score 80-99

> db.demo346.aggregate([
    {
        $match: {
            $expr: {
                $gte: [{ $size: { $ifNull: ["$userDetails", []] } }, 1]
            }
        }
    },
    {
        $addFields: {
            userDetails: {
                $filter: {
                    input: { $ifNull: ["$userDetails", []] },
                    cond: {
                        $and: [
                            { $gte: ["$$this.Score", 80] },
                            { $lte: ["$$this.Score", 99] }
                        ]
                    }
                }
            }
        }
    }
]);

Kết quả

{ "_id": 101, "userDetails": [{ "UserName": "Bob", "Score": 88 }] }
{ "_id": 102, "userDetails": [{ "UserName": "Mike", "Score": 92 }, { "UserName": "Carol", "Score": 97 }] }

Giải thích: $match với $expr lọc document có mảng không rỗng. $filter tạo mảng mới chỉ chứa phần tử Score 80-99.