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

วิธีค้นหาหลายฟิลด์หลายค่าใน MongoDB ด้วย $text และ $search

ใช้ Text Index ร่วมกับ operator $text และ $search เพื่อค้นหาข้อความหลายคำในหลายฟิลด์พร้อมกัน

ข้อกำหนดเบื้องต้น

ต้องสร้าง Text Index ก่อน:

db.collectionName.createIndex({ "field1": "text", "field2": "text" })

ตัวอย่างเต็มรูปแบบ

1. สร้างข้อมูลตัวอย่าง

> db.searchMultipleFieldsDemo.insertOne({"_id":100,"FirstSubject":"Java","SecondSubject":"MongoDB"});
> db.searchMultipleFieldsDemo.insertOne({"_id":101,"FirstSubject":"MongoDB","SecondSubject":"MySQL"});
> db.searchMultipleFieldsDemo.insertOne({"_id":102,"FirstSubject":"MySQL","SecondSubject":"Java"});

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

> db.searchMultipleFieldsDemo.find().pretty();
{ "_id" : 100, "FirstSubject" : "Java", "SecondSubject" : "MongoDB" }
{ "_id" : 101, "FirstSubject" : "MongoDB", "SecondSubject" : "MySQL" }
{ "_id" : 102, "FirstSubject" : "MySQL", "SecondSubject" : "Java" }

3. สร้าง Text Index (จำเป็น)

> db.searchMultipleFieldsDemo.createIndex({ "FirstSubject": "text", "SecondSubject": "text" });

4. ค้นหา "Java" และ "MongoDB" ในทั้งสองฟิลด์

> db.searchMultipleFieldsDemo.find({ $text: { $search: "Java MongoDB" } });
{ "_id" : 102, "FirstSubject" : "MySQL", "SecondSubject" : "Java" }
{ "_id" : 100, "FirstSubject" : "Java", "SecondSubject" : "MongoDB" }
{ "_id" : 101, "FirstSubject" : "MongoDB", "SecondSubject" : "MySQL" }

พฤติกรรมของ $search

  • "Java MongoDB" = ค้นหาเอกสารที่มี Java หรือ MongoDB (OR logic)
  • "\"Java MongoDB\"" = ค้นหาคำวลี "Java MongoDB" ตรงๆ (Phrase search)
  • "Java -MongoDB" = มี Java แต่ ไม่มี MongoDB
  • ค้นหาได้ทุกฟิลด์ที่อยู่ใน Text Index
  • ผลลัพธ์เรียงตาม Text Score (ความเกี่ยวข้อง)

ดู Text Score

db.collection.find(
    { $text: { $search: "Java MongoDB" } },
    { score: { $meta: "textScore" } }
).sort({ score: { $meta: "textScore" } })

สรุป

  • ต้องสร้าง Text Index ก่อน (หนึ่งคอลเลกชันได้แค่ 1 Text Index)
  • ใช้ $text + $search สำหรับ full-text search
  • รองรับหลายภาษา, stemming, case-insensitive
  • ไม่เหมาะกับ exact match หรือ pattern matching (ใช้ regex แทน)