Tôi "nên" có thể đặt tiền tố này với một quan niệm sai lầm trong câu hỏi của bạn. Thực tế là MongoDB khác với RDBMS truyền thống ở chỗ nó là "không có khối lượng" và trên thực tế bạn không cần phải "tạo trường". Vì vậy, điều này khác với "lược đồ bảng" ở chỗ bạn không thể làm bất cứ điều gì cho đến khi lược đồ thay đổi. Tuy nhiên, "xác thực" là một thứ khác cũng như một tính năng "vẫn còn" tương đối mới khi viết.
Nếu bạn muốn "thêm quy tắc xác thực" thì có những phương thức phụ thuộc vào trạng thái hiện tại của bộ sưu tập. Trong cả hai trường hợp, trên thực tế không có chức năng "thêm vào" mà thay vào đó, hành động là "thay thế" tất cả các quy tắc xác thực với những quy tắc mới để chỉ định. Đọc để biết các quy tắc về cách hoạt động của điều này.
Tài liệu Hiện có
Trường hợp bộ sưu tập có các tài liệu hiện có, như được lưu ý trong tài liệu
Tài liệu hiện có
Bạn có thể kiểm soát cách MongoDB xử lý các tài liệu hiện có bằng cách sử dụng validationLevel tùy chọn.
Theo mặc định, validationLevel là nghiêm ngặt và MongoDB áp dụng các quy tắc xác thực cho tất cả các phần chèn và bản cập nhật. Đặt validationLevel để vừa phải áp dụng các quy tắc xác thực cho các phụ trang và cập nhật các tài liệu hiện có đáp ứng các tiêu chí xác nhận. Với mức độ vừa phải cấp, các bản cập nhật cho các tài liệu hiện có không đáp ứng các tiêu chí xác nhận sẽ không được kiểm tra tính hợp lệ.
Phần này và phần ví dụ sau về cơ bản nói rằng ngoài các tùy chọn trên .createCollection()
bạn cũng có thể sửa đổi bộ sưu tập hiện có với các tài liệu, nhưng nên "cảnh giác" rằng các tài liệu hiện tại có thể không đáp ứng các quy tắc bắt buộc. Do đó, hãy sử dụng "vừa phải" nếu bạn không chắc chắn quy tắc sẽ được đáp ứng cho tất cả tài liệu trong bộ sưu tập.
Để đăng ký, bạn sử dụng .runCommand()
hiện tại để phát hành "lệnh" đặt các quy tắc xác thực. Đó là "validationLevel" từ đoạn văn trên.
Vì bạn đã có các quy tắc hiện tại, chúng tôi có thể sử dụng `.getCollectionInfos () để truy xuất chúng, sau đó thêm quy tắc mới và áp dụng:
let validatior = db.getCollectionInfos({name: "MyTestCollection"})[0].options.validator;
validator.$or.push({ "LastLoginDate": { "$type": "date" } });
db.runCommand({
"collMod": "MyTestCollection",
"validator": validator,
"validationLevel": "moderate"
});
Tất nhiên như đã lưu ý trước đó, rằng nếu bạn tự tin rằng tất cả các tài liệu đáp ứng các điều kiện thì bạn có thể áp dụng "nghiêm ngặt" làm mặc định thay thế.
Bộ sưu tập trống
Nếu trong trường hợp đó là bộ sưu tập thực sự "trống" và không có tài liệu nào cả hoặc bạn có thể "bỏ" bộ sưu tập vì dữ liệu hiện tại không phải là hệ quả, sau đó bạn có thể chỉ cần thay đổi ở trên và sử dụng .createCollection()
kết hợp với .drop()
:
let validatior = db.getCollectionInfos({name: "MyTestCollection"})[0].options.validator;
validator.$or.push({ "LastLoginDate": { "$type": "date" } });
db.getCollection("MyTestCollection").drop();
db.createCollection( "MyTestCollection", { "validator": validator });