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

Biểu thức chính quy thường được sử dụng trong tất cả các ngôn ngữ để tìm kiếm một mẫu hoặc từ trong bất kỳ chuỗi nào. MongoDB cũng cung cấp chức năng của biểu thức chính quy để đối sánh mẫu chuỗi bằng cách sử dụng$regexnhà điều hành. MongoDB sử dụng PCRE (Biểu thức chính quy tương thích Perl) làm ngôn ngữ biểu thức chính quy.

Không giống như tìm kiếm văn bản, chúng ta không cần thực hiện bất kỳ cấu hình hoặc lệnh nào để sử dụng biểu thức chính quy.

Giả sử chúng tôi đã chèn một tài liệu vào cơ sở dữ liệu có tên posts như hình dưới đây -

> db.posts.insert(
{
   "post_text": "enjoy the mongodb articles on tutorialspoint",
   "tags": [
      "mongodb",
      "tutorialspoint"
   ]
}
WriteResult({ "nInserted" : 1 })

Sử dụng biểu thức regex

Truy vấn regex sau đây tìm kiếm tất cả các bài đăng có chứa chuỗi tutorialspoint trong đó -

> db.posts.find({post_text:{$regex:"tutorialspoint"}}).pretty()
{
	"_id" : ObjectId("5dd7ce28f1dd4583e7103fe0"),
	"post_text" : "enjoy the mongodb articles on tutorialspoint",
	"tags" : [
		"mongodb",
		"tutorialspoint"
	]
}
{
	"_id" : ObjectId("5dd7d111f1dd4583e7103fe2"),
	"post_text" : "enjoy the mongodb articles on tutorialspoint",
	"tags" : [
		"mongodb",
		"tutorialspoint"
	]
}
>

Truy vấn tương tự cũng có thể được viết dưới dạng:

>db.posts.find({post_text:/tutorialspoint/})

Sử dụng Biểu thức regex với Phân biệt chữ hoa chữ thường

Để làm cho tìm kiếm không phân biệt chữ hoa chữ thường, chúng tôi sử dụng $options tham số với giá trị $i. Lệnh sau sẽ tìm kiếm các chuỗi có từtutorialspoint, bất kể trường hợp nhỏ hơn hay vốn -

>db.posts.find({post_text:{$regex:"tutorialspoint",$options:"$i"}})

Một trong những kết quả trả về từ truy vấn này là tài liệu sau có chứa từ tutorialspoint trong các trường hợp khác nhau -

{
   "_id" : ObjectId("53493d37d852429c10000004"),
   "post_text" : "hey! this is my post on TutorialsPoint", 
   "tags" : [ "tutorialspoint" ]
}

Sử dụng regex cho các phần tử mảng

Chúng ta cũng có thể sử dụng khái niệm regex trên trường mảng. Điều này đặc biệt rất quan trọng khi chúng tôi triển khai chức năng của thẻ. Vì vậy, nếu bạn muốn tìm kiếm tất cả các bài đăng có thẻ bắt đầu từ hướng dẫn từ (hướng dẫn hoặc hướng dẫn hoặc điểm hướng dẫn hoặc hướng dẫnphp), bạn có thể sử dụng mã sau:

>db.posts.find({tags:{$regex:"tutorial"}})

Tối ưu hóa Truy vấn Cụm từ Thông dụng

  • Nếu các trường tài liệu là indexed, truy vấn sẽ sử dụng việc sử dụng các giá trị được lập chỉ mục để khớp với biểu thức chính quy. Điều này làm cho việc tìm kiếm rất nhanh so với việc quét biểu thức thông thường trong toàn bộ bộ sưu tập.

  • Nếu biểu thức chính quy là một prefix expression, tất cả các trận đấu có nghĩa là bắt đầu bằng một ký tự chuỗi nhất định. Ví dụ: nếu biểu thức regex là^tut, thì truy vấn chỉ phải tìm kiếm những chuỗi bắt đầu bằng tut.