MongoDB - Biểu thức chính quy

Xin chào các nhà法师 cơ sở dữ liệu tương lai! Hôm nay, chúng ta sẽ khám phá thế giới thú vị của Biểu thức chính quy trong MongoDB. Đừng lo lắng nếu bạn mới bắt đầu học lập trình - tôi sẽ hướng dẫn bạn từng bước trong hành trình này, giống như tôi đã làm cho hàng trăm sinh viên trong những năm dạy học của mình. Hãy cùng bắt đầu cuộc phiêu lưu này nhé!

MongoDB - Regular Expression

Biểu thức chính quy là gì?

Trước khi chúng ta nhảy vào các chi tiết cụ thể của MongoDB, hãy hiểu biểu thức chính quy (regex) là gì. Hãy tưởng tượng bạn là một thám tử đang cố gắng tìm một mẫu cụ thể trong một biển văn bản. Đó chính xác là điều regex làm - nó giúp bạn tìm kiếm các mẫu trong chuỗi. Đúng là rất thú vị phải không?

Sử dụng biểu thức chính quy trong MongoDB

Trong MongoDB, chúng ta sử dụng regex để thực hiện khớp mẫu trong các truy vấn. Nó giống như có một kính lúp siêu mạnh cho cơ sở dữ liệu của bạn!

Hãy bắt đầu với một ví dụ đơn giản. Giả sử chúng ta có một bộ sưu tập sách, và chúng ta muốn tìm tất cả các sách có tựa đề bắt đầu bằng "The".

db.books.find({ title: /^The/ })

Trong truy vấn này:

  • db.books là bộ sưu tập của chúng ta
  • find() là phương thức chúng ta sử dụng để tìm kiếm
  • title là trường chúng ta đang tìm kiếm
  • /^The/ là mẫu regex của chúng ta

Ký tự ^ có nghĩa là "bắt đầu với". Vì vậy, truy vấn này tìm tất cả các tài liệu mà tựa đề bắt đầu với "The".

Hãy phân tích kỹ hơn:

// Đây sẽ khớp:
"The Great Gatsby"
"The Catcher in the Rye"

// Đây sẽ không khớp:
"Catch-22"
"To Kill a Mockingbird"

Sử dụng biểu thức chính quy không phân biệt chữ hoa chữ thường

Bây giờ, nếu chúng ta muốn tìm sách bắt đầu bằng "the", nhưng không quan tâm nó là chữ hoa hay chữ thường? Chúng ta có thể làm cho regex không phân biệt chữ hoa chữ thường!

db.books.find({ title: /^the/i })

Ký tự i ở cuối mẫu regex làm cho nó không phân biệt chữ hoa chữ thường. Bây giờ nó sẽ khớp với:

"The Great Gatsby"
"the catcher in the rye"
"THE LORD OF THE RINGS"

Sử dụng biểu thức chính quy cho phần tử mảng

Sức mạnh của regex trong MongoDB cũng mở rộng đến các mảng! Giả sử chúng ta có một bộ sưu tập phim với một mảng thể loại. Chúng ta có thể tìm kiếm các phim có thể loại khớp với một mẫu cụ thể.

db.movies.find({ genres: /^Sci/ })

Truy vấn này sẽ tìm các phim có thể loại bắt đầu với "Sci", như:

{ title: "Interstellar", genres: ["Sci-Fi", "Adventure", "Drama"] }
{ title: "The Matrix", genres: ["Sci-Fi", "Action"] }

Tối ưu hóa truy vấn biểu thức chính quy

Mặc dù regex rất mạnh mẽ, nhưng nó có thể chậm nếu không sử dụng cẩn thận. Dưới đây là một số mẹo để tối ưu hóa truy vấn regex của bạn:

  1. Sử dụng các dấu neo: ^ cho đầu và $ cho cuối của chuỗi.
  2. Tránh bắt đầu với ký tự wildcard: Các mẫu như /.*abc/ là chậm.
  3. Sử dụng chỉ mục: Nếu có thể, tạo chỉ mục trên trường bạn đang truy vấn.

Dưới đây là ví dụ về một truy vấn tối ưu hơn:

db.books.find({ title: /^The.*Potter$/i })

Truy vấn này sẽ hiệu quả tìm các sách bắt đầu với "The" (không phân biệt chữ hoa chữ thường) và kết thúc với "Potter".

Phương thức regex trong MongoDB

MongoDB cung cấp nhiều phương thức regex. Hãy xem chúng trong bảng:

Phương thức Mô tả Ví dụ
$regex Cung cấp khả năng khớp mẫu biểu thức chính quy { name: { $regex: /john/i } }
$options Thay đổi hành vi khớp của $regex { name: { $regex: /john/, $options: 'i' } }

Các tùy chọn $options có thể bao gồm:

  • i cho không phân biệt chữ hoa chữ thường
  • m cho khớp đa dòng
  • x cho bỏ qua khoảng trống trong regex

Bài tập thực hành

Hãy áp dụng kiến thức của chúng ta vào bài tập! Giả sử chúng ta có một bộ sưu tập email. Chúng ta muốn tìm tất cả các email từ tài khoản gmail.

db.emails.find({ address: /.*@gmail\.com$/i })

Biểu thức regex này:

  • .* khớp với bất kỳ ký tự nào
  • @gmail\.com khớp chính xác với "@gmail.com" (chúng ta escape dấu chấm bằng \)
  • $ đảm bảo khớp ở cuối chuỗi
  • i làm cho nó không phân biệt chữ hoa chữ thường

Vậy nó sẽ khớp với:

[email protected]
[email protected]

Nhưng không khớp với:

[email protected]
[email protected]

Kết luận

Chúc mừng! Bạn đã迈出进入MongoDB的正则表达式世界的第一步。 Nhớ rằng, như bất kỳ công cụ mạnh mẽ nào khác, regex nên được sử dụng một cách khôn ngoan. Bắt đầu từ những điều đơn giản, kiểm tra kỹ lưỡng và tối ưu hóa khi cần thiết.

Như tôi luôn nói với học sinh của mình, cách tốt nhất để học là làm. Vậy hãy mở shell MongoDB của bạn và bắt đầu thử nghiệm với regex. Ai biết được? Bạn có thể trở thành Sherlock Holmes của truy vấn cơ sở dữ liệu!

Chúc bạn lập trình vui vẻ, và may mắn với regex!

Credits: Image by storyset