MongoDB Biểu thức chính quy (Regex) với các ví dụ

Mục lục:

Anonim

Biểu thức chính quy được sử dụng để đối sánh mẫu, về cơ bản là cho các chuỗi kết quả trong tài liệu.

Đôi khi khi truy xuất tài liệu trong một bộ sưu tập, bạn có thể không biết chính xác giá trị Trường chính xác cần tìm kiếm. Do đó, người ta có thể sử dụng biểu thức chính quy để hỗ trợ truy xuất dữ liệu dựa trên các giá trị tìm kiếm phù hợp với mẫu.

Trong hướng dẫn này, bạn sẽ học -

  • Sử dụng toán tử $ regex để đối sánh Mẫu
  • Khớp mẫu với $ options
  • Đối sánh mẫu không có toán tử regex
  • Tìm nạp tài liệu 'n' cuối cùng từ một bộ sưu tập

Sử dụng toán tử $ regex để đối sánh Mẫu

Toán tử regex trong MongoDB được sử dụng để tìm kiếm các chuỗi cụ thể trong bộ sưu tập. Ví dụ sau đây cho thấy điều này có thể được thực hiện như thế nào.

Giả sử rằng chúng ta có cùng một tập hợp Nhân viên có tên Trường là "Employeeid" và "EmployeeName". Giả sử rằng chúng ta có các tài liệu sau trong bộ sưu tập của mình.

Mã hiệu công nhân Tên nhân viên
22 NewMartin
2 Mohan
3 Joe
4 MohanR
100 Guru99
6 Gurang

Ở đây trong đoạn mã dưới đây, chúng tôi đã sử dụng toán tử regex để chỉ định tiêu chí tìm kiếm.

db.Employee.find({EmployeeName : {$regex: "Gu" }}).forEach(printjson)

Giải thích mã:

  1. Ở đây chúng tôi muốn tìm tất cả Tên nhân viên có ký tự 'Gu' trong đó. Do đó, chúng tôi chỉ định toán tử $ regex để xác định tiêu chí tìm kiếm của 'Gu'
  2. Printjson đang được sử dụng để in từng tài liệu được trả về bởi truy vấn theo cách tốt hơn.

Nếu lệnh được thực hiện thành công, đầu ra sau sẽ được hiển thị:

Đầu ra:

Kết quả cho thấy rõ ràng rằng những tài liệu trong đó Tên nhân viên chứa các ký tự 'Gu' sẽ được trả về.

Nếu giả sử bộ sưu tập của bạn có các tài liệu sau với một tài liệu bổ sung có Tên nhân viên là "Guru999". Nếu bạn đã nhập tiêu chí tìm kiếm là "Guru99", nó cũng sẽ trả về tài liệu có "Guru999". Nhưng giả sử nếu chúng tôi không muốn điều này và chỉ muốn trả lại tài liệu bằng "Guru99". Sau đó, chúng tôi có thể làm điều này với khớp mẫu chính xác. Để thực hiện đối sánh mẫu chính xác, chúng tôi sẽ sử dụng ký tự và $. Chúng ta sẽ thêm ký tự vào đầu chuỗi và $ ở cuối chuỗi.

Mã hiệu công nhân Tên nhân viên
22 NewMartin
2 Mohan
3 Joe
4 MohanR
100 Guru99
6 Gurang
số 8 Guru999

Ví dụ sau đây cho thấy điều này có thể được thực hiện như thế nào.

db.Employee.find({EmployeeName : {$regex: "^Guru99$"}}).forEach(printjson) 

Giải thích mã:

  1. Ở đây trong tiêu chí tìm kiếm, chúng tôi đang sử dụng ký tự và $. Dấu được sử dụng để đảm bảo rằng chuỗi bắt đầu bằng một ký tự nhất định và $ được sử dụng để đảm bảo rằng chuỗi kết thúc bằng một ký tự nhất định. Vì vậy, khi mã thực thi, nó sẽ chỉ tìm nạp chuỗi có tên "Guru99".
  2. Printjson đang được sử dụng để in từng tài liệu được trả về bởi truy vấn theo cách tốt hơn.

Nếu lệnh được thực hiện thành công, đầu ra sau sẽ được hiển thị:

Đầu ra:

Trong đầu ra, có thể thấy rõ rằng chuỗi "Guru99" được tìm nạp.

Khớp mẫu với $ options

Khi sử dụng toán tử regex, người ta cũng có thể cung cấp các tùy chọn bổ sung bằng cách sử dụng từ khóa $ options . Ví dụ: giả sử bạn muốn tìm tất cả các tài liệu có 'Gu' trong Tên nhân viên của họ, bất kể tài liệu đó phân biệt chữ hoa chữ thường hay không nhạy cảm. Nếu kết quả như vậy được mong muốn, thì chúng ta cần sử dụng các tùy chọn $ với tham số phân biệt chữ hoa chữ thường.

Ví dụ sau đây cho thấy điều này có thể được thực hiện như thế nào.

Giả sử rằng chúng ta có cùng một tập hợp Nhân viên có tên Trường là "Employeeid" và "EmployeeName".

Giả sử rằng chúng ta có các tài liệu sau trong bộ sưu tập của mình.

Mã hiệu công nhân Tên nhân viên
22 NewMartin
2 Mohan
3 Joe
4 MohanR
100 Guru99
6 Gurang
7 GURU99

Bây giờ nếu chúng tôi chạy cùng một truy vấn như trong chủ đề trước, chúng tôi sẽ không bao giờ thấy tài liệu có "GURU99" trong kết quả. Để đảm bảo điều này xuất hiện trong tập kết quả, chúng ta cần thêm tham số $ options "I".

db.Employee.find({EmployeeName:{$regex: "Gu",$options:'i'}}).forEach(printjson) 

Giải thích mã:

  1. Các tùy chọn $ với tham số 'I' (có nghĩa là không phân biệt chữ hoa chữ thường) chỉ định rằng chúng tôi muốn thực hiện tìm kiếm bất kể chúng tôi tìm thấy các chữ cái 'Gu' ở dạng viết thường hay viết hoa.

Nếu lệnh được thực hiện thành công, đầu ra sau sẽ được hiển thị:

Đầu ra:

  1. Kết quả cho thấy rõ ràng rằng ngay cả khi một tài liệu có chữ 'Gu' viết hoa, tài liệu vẫn được hiển thị trong tập kết quả.

Đối sánh mẫu không có toán tử regex

Người ta cũng có thể thực hiện đối sánh mẫu mà không cần toán tử regex. Ví dụ sau đây cho thấy điều này có thể được thực hiện như thế nào.

db.Employee.find({EmployeeName: /Gu/'}).forEach(printjson)

Giải thích mã:

  1. Các tùy chọn "//" về cơ bản có nghĩa là chỉ định tiêu chí tìm kiếm của bạn trong các dấu phân cách này. Do đó, chúng tôi đang chỉ định / Gu / để tìm lại những tài liệu có 'Gu' trong Tên nhân viên của chúng.

Nếu lệnh được thực hiện thành công, đầu ra sau sẽ được hiển thị:

Đầu ra:

Kết quả cho thấy rõ ràng rằng những tài liệu trong đó Tên nhân viên chứa các ký tự 'Gu' sẽ được trả về.

Tìm nạp tài liệu 'n' cuối cùng từ một bộ sưu tập

Có nhiều cách khác nhau để lấy n tài liệu cuối cùng trong một bộ sưu tập.

Hãy xem xét một trong những cách qua các bước sau

Ví dụ sau đây cho thấy điều này có thể được thực hiện như thế nào.

Giả sử rằng chúng ta có cùng một tập hợp Nhân viên có tên Trường là "Employeeid" và "EmployeeName".

Giả sử rằng chúng ta có các tài liệu sau trong bộ sưu tập của mình:

Mã hiệu công nhân Tên nhân viên
22 NewMartin
2 Mohan
3 Joe
4 MohanR
100 Guru99
6 Gurang
7 GURU99
db.Employee.find().sort({_id:-1}).limit(2).forEach(printjson)

Giải thích mã:

1) Khi truy vấn tài liệu, hãy sử dụng chức năng sắp xếp để sắp xếp các bản ghi theo thứ tự ngược lại dựa trên giá trị trường _id trong tập hợp. -1 về cơ bản chỉ ra để sắp xếp các tài liệu theo thứ tự ngược lại hoặc thứ tự giảm dần để tài liệu cuối cùng trở thành tài liệu đầu tiên được hiển thị.

2) Sau đó, sử dụng mệnh đề giới hạn để chỉ hiển thị số lượng bản ghi bạn muốn. Ở đây chúng tôi đã đặt mệnh đề giới hạn (2), vì vậy nó sẽ tìm nạp hai tài liệu cuối cùng.

Nếu lệnh được thực hiện thành công, đầu ra sau sẽ được hiển thị:

Đầu ra:

Kết quả hiển thị rõ ràng rằng hai tài liệu cuối cùng trong bộ sưu tập được hiển thị. Do đó, chúng tôi đã chỉ ra rõ ràng rằng để tìm nạp tài liệu 'n' cuối cùng trong bộ sưu tập, trước tiên chúng tôi có thể sắp xếp tài liệu theo thứ tự giảm dần và sau đó sử dụng mệnh đề giới hạn để trả về số tài liệu 'n' được yêu cầu.

Lưu ý : Nếu tìm kiếm được thực hiện trên một chuỗi lớn hơn 38.000 ký tự, nó sẽ không hiển thị kết quả phù hợp.

Tóm lược:

  • So khớp mẫu có thể được thực hiện bởi toán tử $ regex. Toán tử này có thể được sử dụng để tìm các chuỗi nhất định trong bộ sưu tập.
  • Ký hiệu và $ có thể được sử dụng cho các tìm kiếm văn bản chính xác với được sử dụng để đảm bảo rằng chuỗi bắt đầu bằng một ký tự nhất định và $ được sử dụng để đảm bảo rằng chuỗi kết thúc bằng một ký tự nhất định.
  • Chữ 'i' cùng với toán tử $ regex có thể được sử dụng để chỉ định phân biệt chữ hoa chữ thường để các chuỗi có thể được tìm kiếm cho dù chúng ở dạng chữ thường hay chữ hoa.
  • Dấu phân cách // cũng có thể được sử dụng để đối sánh mẫu.
  • Sử dụng kết hợp sắp xếp và hàm giới hạn để trả về n tài liệu cuối cùng trong bộ sưu tập. Chức năng sắp xếp có thể được sử dụng để trả về các tài liệu theo thứ tự giảm dần, sau đó mệnh đề giới hạn có thể được sử dụng để giới hạn số lượng tài liệu được trả lại.