ใช้ $addFields ร่วม $filter, $indexOfBytes, $toUpper เพื่อกรองอาร์เรย์เฉพาะรายการที่มีคำว่า "work" (ไม่สนใจตัวพิมพ์เล็ก/ใหญ่)
ตัวอย่างข้อมูลทดสอบ
> db.demo383.insertOne({
"ServerName":"Jboss",
"ServerLogs": [
{"status":"Working"},
{"status":"Stop"},
{"status":"Worked"}
]
});
แสดงข้อมูลก่อน
> db.demo383.find().pretty();
{
"_id" : ObjectId("5e5b635422064be7ab44e7f1"),
"ServerName" : "Jboss",
"ServerLogs" : [
{"status" : "Working"}, {"status" : "Stop"}, {"status" : "Worked"}
]
}
คำสั่ง Aggregation กรองเฉพาะที่มี "work"
> db.demo383.aggregate([
{"$addFields": {
"ServerLogs": {
"$filter": {
"input": "$ServerLogs",
"cond": {
"$ne": [
{"$indexOfBytes": [
{"$toUpper": "$$this.status"},
{"$toUpper": "work"}
]},
-1
]
}
}
}
}}
])
ผลลัพธ์ (เหลือ Working และ Worked)
{
"_id" : ObjectId("5e5b635422064be7ab44e7f1"),
"ServerName" : "Jboss",
"ServerLogs" : [
{"status" : "Working"}, {"status" : "Worked"}
]
}
คำอธิบาย:
$toUpperแปลงทั้ง status และคำค้นหาเป็นพิมพ์ใหญ่ (Case-insensitive)$indexOfBytesหาตำแหน่ง substring คืน -1 ถ้าไม่พบ$ne: [..., -1]เก็บเฉพาะที่พบ (ไม่เท่ากับ -1)$filterสร้างอาร์เรย์ใหม่เฉพาะรายการที่ผ่านเงื่อนไข