Mọi người đều biết rằng MongoDB là không có phạm vi, vậy tại sao nó lại được yêu cầu thực hiện xác thực lược đồ? Rất dễ dàng và nhanh chóng để phát triển ứng dụng với hành vi không có lược đồ của MongoDB và sử dụng nó như một bằng chứng về khái niệm. Nhưng một khi ứng dụng chuyển sang sản xuất và trở nên ổn định và hoàn thiện, thì không cần phải thay đổi giản đồ thường xuyên và cũng không nên. Tại thời điểm này, điều rất quan trọng là phải thực thi một số xác thực lược đồ trong cơ sở dữ liệu của bạn để tránh việc chèn dữ liệu không mong muốn có thể phá vỡ ứng dụng của bạn. Điều này trở nên quan trọng hơn nhiều khi dữ liệu được chèn từ nhiều nguồn trong cùng một cơ sở dữ liệu.
Xác thực lược đồ cho phép bạn xác định cấu trúc cụ thể của các tài liệu trong mỗi bộ sưu tập. Nếu bất kỳ ai cố gắng chèn một số tài liệu không khớp với lược đồ đã xác định, MongoDB có thể từ chối loại hoạt động này hoặc đưa ra cảnh báo tùy theo loại hành động xác thực.
MongoDB cung cấp hai cách để xác thực lược đồ của bạn, Xác thực tài liệu và xác thực lược đồ JSON. Xác thực lược đồ JSON là phiên bản mở rộng của xác thực tài liệu, vì vậy hãy bắt đầu với xác thực tài liệu.
Xác thực tài liệu
Hầu hết các nhà phát triển đã làm việc với cơ sở dữ liệu quan hệ đều biết tầm quan trọng của khả năng dự đoán của các mô hình dữ liệu hoặc lược đồ. Do đó, MongoDB đã giới thiệu xác thực tài liệu từ phiên bản 3.2. Hãy xem cách thêm quy tắc xác thực trong bộ sưu tập MongoDB.
Giả sử, bạn có một tập hợp người dùng có các loại tài liệu sau.
{
"name": "Alex",
"email": "[email protected]",
"mobile": "123-456-7890"
}
Và, sau đây là các xác thực mà chúng tôi muốn kiểm tra khi thêm tài liệu mới vào bộ sưu tập của người dùng:
- tên, các trường email là bắt buộc
- số điện thoại di động phải tuân theo cấu trúc cụ thể:xxx-xxx-xxxx
Để thêm xác thực này, chúng tôi có thể sử dụng cấu trúc "trình xác thực" trong khi tạo một bộ sưu tập mới. Chạy truy vấn sau trong Mongo shell,
db.createCollection("users", {
validator: {
$and: [
{
"name": {$type: "string", $exists: true}
},
{
"mobile": {$type: "string", $regex: /^[0-9]{3}-[0-9]{3}-[0-9]{4}$/}
},
{
"email": {$type: "string", $exists: true}
}
]
}
})
Bạn sẽ thấy kết quả sau:
{ "ok" : 1 }
Bây giờ, nếu bạn cố gắng thêm bất kỳ tài liệu mới nào mà không tuân theo các quy tắc xác thực thì mongo sẽ xuất hiện một lỗi xác thực. Hãy thử chạy các truy vấn chèn sau.
Truy vấn:1
db.users.insert({
"name": "akash"
})
Đầu ra:
WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 121,
"errmsg" : "Document failed validation"
}
})
Truy vấn:2
db.users.insert({
"name": "akash",
"email": "[email protected]",
"mobile": "123-456-7890"
})
Đầu ra:
WriteResult({ "nInserted" : 1 })
Tuy nhiên, có một số hạn chế với phương pháp xác thực tài liệu chẳng hạn như người ta có thể thêm bất kỳ số lượng cặp khóa-giá trị mới nào vào tài liệu và chèn nó vào bộ sưu tập. Không thể ngăn chặn điều này bằng xác thực tài liệu. Hãy xem xét ví dụ sau,
db.users.insert({
"name": "akash",
"email": "[email protected]",
"mobile": "123-456-7890",
"gender": "Male"
})
Đầu ra:
WriteResult({ "nInserted" : 1 })
Ngoài ra, xác thực tài liệu chỉ kiểm tra các giá trị. Giả sử, nếu bạn cố gắng thêm tài liệu với "nmae" (typo) làm khóa thay vì "tên", mongo sẽ coi nó như một trường mới và tài liệu sẽ được chèn vào DB. Những điều này nên tránh khi bạn đang làm việc với cơ sở dữ liệu sản xuất. Để hỗ trợ tất cả điều này, MongoDB đã giới thiệu toán tử "jsonSchema" với cấu trúc "trình xác thực" từ phiên bản 3.6. Hãy xem cách thêm các quy tắc xác thực tương tự như trên và tránh thêm các trường mới / sai chính tả.
Vài người trở thành MongoDB DBA - Đưa MongoDB vào Sản xuất Tìm hiểu về những điều bạn cần biết để triển khai, giám sát, quản lý và mở rộng MongoDBDownload miễn phíjsonSchema Validation
Chạy lệnh sau trong trình bao mongo để thêm các quy tắc xác thực bằng toán tử "jsonSchema".
db.runCommand(
{
"collMod": "users_temp",
"validator": {
"$jsonSchema": {
"bsonType": "object",
"additionalProperties": false,
"required": [
"name",
"email"
],
"properties": {
"_id": {},
"name": {
"bsonType": "string"
},
"email": {
"bsonType": "string"
},
"mobile": {
"bsonType": "string",
"pattern": "^[0-9]{3}-[0-9]{3}-[0-9]{4}$"
}
}
}
}
})
Hãy xem bây giờ, điều gì sẽ xảy ra khi chúng ta cố gắng chèn tài liệu sau.
db.users.insert({
"name": "akash",
"email": "[email protected]",
"mobile": "123-456-7890",
"gender": "Male"
})
Nó sẽ xuất hiện lỗi vì chúng tôi chưa xác định trường giới tính trong "jsonSchema".
WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 121,
"errmsg" : "Document failed validation"
}
})
Tương tự như vậy, nếu bạn mắc lỗi chính tả trong bất kỳ tên trường nào, mongo sẽ gặp phải lỗi tương tự.
Lược đồ được xác định ở trên giống với lược đồ mà chúng tôi đã sử dụng trong xác thực tài liệu. Ngoài ra, chúng tôi đã thêm trường "Đặc tính bổ sung" để tránh lỗi chính tả trong tên trường và thêm các trường mới trong tài liệu. Nó sẽ chỉ cho phép các trường được xác định trong trường "thuộc tính". Đây là tổng quan về một số thuộc tính mà chúng ta có thể sử dụng trong toán tử "jsonSchema".
- bsonType:array | đối tượng | chuỗi | boolean | số | null
- bắt buộc:một mảng gồm tất cả các trường bắt buộc
- enum:một mảng chỉ các giá trị có thể có cho bất kỳ trường nào
- tối thiểu:giá trị nhỏ nhất của trường
- tối đa:giá trị lớn nhất của trường
- minLength:độ dài tối thiểu của trường
- mixLength:độ dài tối đa của trường Thuộc tính
- :một tập hợp các lược đồ JSON hợp lệ
- addProperties:ngăn chúng tôi thêm bất kỳ trường nào khác ngoài những trường được đề cập trong trường thuộc tính
- title:tiêu đề cho bất kỳ trường nào.
- mô tả:mô tả ngắn cho bất kỳ trường nào.
Ngoài xác thực giản đồ, toán tử "jsonSchema" cũng có thể được sử dụng trong giai đoạn tìm và so khớp bên trong đường dẫn tổng hợp.
Kết luận
Việc xác thực tài liệu / lược đồ là không bắt buộc hoặc mong muốn trong mọi tình huống nhưng nhìn chung, bạn nên thêm chúng vào cơ sở dữ liệu của mình vì nó sẽ tăng năng suất của các nhà phát triển đang xử lý cơ sở dữ liệu của bạn. Họ sẽ biết loại phản hồi mong đợi từ cơ sở dữ liệu vì sẽ không có bất kỳ dữ liệu ngẫu nhiên nào.
Trong bài viết này, chúng ta đã tìm hiểu về tầm quan trọng của xác thực lược đồ trong MongoDB và cách thêm xác thực ở cấp tài liệu bằng cách sử dụng xác thực tài liệu và toán tử "jsonSchema".