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

ค้นหา Domain Name ใน URL Records ด้วย MongoDB Regex

การค้นหา domain name ใน URL field แบบ case-insensitive ใช้ regular expression ด้วย flag i (/pattern/i หรือ {$regex: pattern, $options: "i"})

สร้างคอลเลกชันและข้อมูลตัวอย่าง

> db.demo219.insertOne({"details":{"WebsiteURL":"www.EXAMPLE.com"}});
{ "acknowledged" : true, "insertedId" : ObjectId("5e3e667203d395bdc2134718") }
> db.demo219.insertOne({"details":{"WebsiteURL":"www.gmail.com"}});
{ "acknowledged" : true, "insertedId" : ObjectId("5e3e667803d395bdc2134719") }
> db.demo219.insertOne({"details":{"WebsiteURL":"www.example.com"}});
{ "acknowledged" : true, "insertedId" : ObjectId("5e3e667f03d395bdc213471a") }

แสดงข้อมูลทั้งหมด

> db.demo219.find();

ผลลัพธ์: EXAMPLE.com (uppercase), gmail.com, example.com (lowercase)

Query ค้นหา Domain "example" แบบ Case-Insensitive

> db.demo219.find({"details.WebsiteURL": /example/i});

ผลลัพธ์

{ "_id" : ObjectId("5e3e667203d395bdc2134718"), "details" : { "WebsiteURL" : "www.EXAMPLE.com" } }
{ "_id" : ObjectId("5e3e667f03d395bdc213471a"), "details" : { "WebsiteURL" : "www.example.com" } }

จับทั้ง "EXAMPLE.com" และ "example.com" เพราะ flag i (case-insensitive)
ไม่จับ "gmail.com"

Regex Pattern สำหรับ Domain Matching

ใช้ $regex Operator Syntax

// เทียบเท่า /example/i
db.demo219.find({"details.WebsiteURL": {$regex: "example", $options: "i"}})

// ใช้ variable
var domain = "example";
db.demo219.find({"details.WebsiteURL": {$regex: domain, $options: "i"}})

Performance Considerations

  • Regex นำหน้า (^pattern) ใช้ index ได้
  • Regex contains (pattern ไม่มี ^) ใช้ index ไม่ได้ → full scan
  • Case-insensitive ($options: "i") ใช้ index ไม่ได้ (ยกเว้น collation index)
  • Dataset ใหญ่ ควรใช้ text index หรือ Atlas Search แทน

Text Index Alternative (สำหรับ Full-Text Search)

db.demo219.createIndex({"details.WebsiteURL": "text"})
db.demo219.find({$text: {$search: "example"}})

Aggregation: Extract Domain แล้ว Group By

db.demo219.aggregate([
  { $project: {
    domain: {
      $arrayElemAt: [
        { $split: ["$details.WebsiteURL", "."] },
        1  // index 1 = domain (www.example.com → example)
      ]
    }
  }},
  { $group: { _id: { $toLower: "$domain" }, count: { $sum: 1 }}}
])

สรุป: ใช้ /pattern/i สำหรับ case-insensitive domain search ใส่ ^ และ \. เพื่อ precision มากขึ้น

Patternจับได้ไม่จับ
/example/iexample.com, EXAMPLE.COM, sub.example.comexamples.com, myexample.com
/^example\./iexample.com, example.orgsub.example.com, myexample.com
/example\.com$/iexample.com, www.example.comexample.org, example.com.br
/^[^.]*\.example\./iwww.example.com, api.example.comexample.com, sub.www.example.com