Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MongoDB

กรอง Log ที่มีคำว่า "work" ใน MongoDB ด้วย Aggregation

ใช้ $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"}
    ]
}

คำอธิบาย:

  1. $toUpper แปลงทั้ง status และคำค้นหาเป็นพิมพ์ใหญ่ (Case-insensitive)
  2. $indexOfBytes หาตำแหน่ง substring คืน -1 ถ้าไม่พบ
  3. $ne: [..., -1] เก็บเฉพาะที่พบ (ไม่เท่ากับ -1)
  4. $filter สร้างอาร์เรย์ใหม่เฉพาะรายการที่ผ่านเงื่อนไข