ใช้ Aggregation Pipeline ร่วม $unwind แล้วค่อย $match เพื่อกรอง Array ใน Subdocument
สร้างข้อมูลตัวอย่าง
> db.filterArray.insertOne({
"L": [
{"N": 1}, {"N": 2}, {"N": 3}, {"N": 4}, {"N": 5}
]
});
{ "acknowledged" : true, "insertedId" : ObjectId("5c6d63f2734e98fc0a434aeb") }
แสดงเอกสาร
> db.filterArray.find().pretty();
{
"_id" : ObjectId("5c6d63f2734e98fc0a434aeb"),
"L" : [ {"N":1}, {"N":2}, {"N":3}, {"N":4}, {"N":5} ]
}
Filter ค่า N > 3
> db.filterArray.aggregate([
{ $match: { _id: ObjectId("5c6d63f2734e98fc0a434aeb") }},
{ $unwind: "$L" },
{ $match: { "L.N": { $gt: 3 }}},
{ $group: { _id: "$_id", subDocument: { $push: "$L.N" }}}
]).pretty();
ผลลัพธ์
{
"_id" : ObjectId("5c6d63f2734e98fc0a434aeb"),
"subDocument" : [ 4, 5 ]
}
Pipeline: $match เลือกเอกสาร → $unwind แยก Array → $match กรองค่า > 3 → $group รวมกลับเป็น Array ใหม่