Tóm lược. trong hướng dẫn này, bạn sẽ tìm hiểu về các chỉ mục duy nhất và cách sử dụng chúng để thực thi tính duy nhất của các giá trị cho một trường trên các tài liệu trong một bộ sưu tập
Giới thiệu về chỉ mục duy nhất MongoDB
Thông thường, bạn muốn đảm bảo rằng các giá trị của trường là duy nhất trên các tài liệu trong bộ sưu tập, chẳng hạn như email hoặc tên người dùng
Một chỉ mục duy nhất có thể giúp bạn thực thi quy tắc này. Trên thực tế, MongoDB sử dụng một chỉ mục duy nhất để đảm bảo rằng
9 là khóa chính duy nhấtCode language: JavaScript [javascript]
db.users.insertMany[[ { email: "john@test.com", name: "john"}, { email: "jane@test.com", name: "jane"}, ]];
Để tạo một chỉ mục duy nhất, bạn sử dụng phương thức
0 với tùy chọnCode language: CSS [css]
db.users.createIndex[{email:1},{unique:true}];
1 như thế nàyCode language: CSS [css]
db.users.createIndex[{email:1},{unique:true}];
Code language: CSS [css]
db.collection.createIndex[{ field: 1}, {unique: true}];
Ví dụ về chỉ mục duy nhất của MongoDB
Hãy lấy một số ví dụ về việc sử dụng một chỉ mục duy nhất
1] Tạo một chỉ mục duy nhất cho một trường
Đầu tiên, chèn hai tài liệu vào bộ sưu tập
2Code language: CSS [css]
db.users.createIndex[{email:1},{unique:true}];
Code language: JavaScript [javascript]
db.users.insertMany[[ { email: "john@test.com", name: "john"}, { email: "jane@test.com", name: "jane"}, ]];
Thứ hai, tạo một chỉ mục duy nhất cho trường email
Code language: CSS [css]
db.users.createIndex[{email:1},{unique:true}];
Thứ ba, cố gắng chèn một tài liệu mới với email đã tồn tại
Code language: CSS [css]
db.users.insertOne[ { email: "john@test.com", name: "johny"} ];
MongoDB trả về lỗi sau
________số 82] Tạo một chỉ mục duy nhất cho bộ sưu tập với dữ liệu trùng lặp
Đầu tiên, thả bộ sưu tập
2 và tạo lại nó bằng cách chèn ba mụcCode language: CSS [css]
db.users.createIndex[{email:1},{unique:true}];
0Code language: CSS [css]
db.users.createIndex[{email:1},{unique:true}];
Thứ hai, cố gắng tạo một chỉ mục duy nhất cho trường email của bộ sưu tập
2Code language: CSS [css]
db.users.createIndex[{email:1},{unique:true}];
2Code language: CSS [css]
db.users.createIndex[{email:1},{unique:true}];
MongoDB trả về lỗi sau
3Code language: CSS [css]
db.users.createIndex[{email:1},{unique:true}];
Lý do là email có các mục trùng lặp
5Code language: CSS [css]
db.users.createIndex[{email:1},{unique:true}];
Thông thường, bạn tạo một chỉ mục duy nhất trên một bộ sưu tập trước khi chèn bất kỳ dữ liệu nào. Bằng cách này, bạn đảm bảo các ràng buộc về tính duy nhất ngay từ đầu
Nếu bạn tạo một chỉ mục duy nhất trên một bộ sưu tập có chứa dữ liệu, bạn có nguy cơ thất bại vì bộ sưu tập có thể có các giá trị trùng lặp. Khi tồn tại các giá trị trùng lặp, việc tạo chỉ mục duy nhất không thành công như trong ví dụ trước
Để khắc phục điều này, bạn cần xem lại dữ liệu và xóa các mục trùng lặp theo cách thủ công trước khi tạo chỉ mục duy nhất. Ví dụ
Đầu tiên, xóa người dùng trùng lặp
5Code language: CSS [css]
db.users.createIndex[{email:1},{unique:true}];
đầu ra
6Code language: CSS [css]
db.users.createIndex[{email:1},{unique:true}];
Sau đó, tạo một chỉ mục duy nhất cho trường email
2Code language: CSS [css]
db.users.createIndex[{email:1},{unique:true}];
đầu ra
1Code language: JavaScript [javascript]
db.users.insertMany[[ { email: "john@test.com", name: "john"}, { email: "jane@test.com", name: "jane"}, ]];
Chỉ số hợp chất duy nhất
Khi một chỉ mục duy nhất chứa nhiều hơn một trường, nó được gọi là chỉ mục hợp chất duy nhất. Chỉ mục hợp chất duy nhất đảm bảo tính duy nhất của sự kết hợp các trường
Ví dụ: nếu bạn tạo chỉ mục kết hợp duy nhất cho trường 1 và trường 2, các giá trị sau đây là duy nhất
field1field2Combination11[1,1]12[1,2]21[2,1]22[2,2]Tuy nhiên, các giá trị sau được trùng lặp
field1field2Combination11[1,1]11[1,1] -> trùng lặp21[2,1]21[2,1] -> trùng lặpĐể tạo một chỉ mục tổng hợp duy nhất, bạn chỉ định các trường trong đặc tả chỉ mục như thế này
2Code language: JavaScript [javascript]
db.users.insertMany[[ { email: "john@test.com", name: "john"}, { email: "jane@test.com", name: "jane"}, ]];
Hãy lấy ví dụ về việc sử dụng chỉ số ghép duy nhất
Đầu tiên, tạo bộ sưu tập
6 bằng cách thêm một vị trí vào đó
db.users.createIndex[{email:1},{unique:true}];
Code language: CSS [css]
3Code language: JavaScript [javascript]
db.users.insertMany[[ { email: "john@test.com", name: "john"}, { email: "jane@test.com", name: "jane"}, ]];
Thứ hai, tạo chỉ mục ghép duy nhất cho các trường
7 vàCode language: CSS [css]
db.users.createIndex[{email:1},{unique:true}];
8 của tập hợpCode language: CSS [css]
db.users.createIndex[{email:1},{unique:true}];
6Code language: CSS [css]
db.users.createIndex[{email:1},{unique:true}];
4Code language: JavaScript [javascript]
db.users.insertMany[[ { email: "john@test.com", name: "john"}, { email: "jane@test.com", name: "jane"}, ]];
đầu ra
5Code language: JavaScript [javascript]
db.users.insertMany[[ { email: "john@test.com", name: "john"}, { email: "jane@test.com", name: "jane"}, ]];
Thứ ba, chèn một vị trí có giá trị
7 đã tồn tạiCode language: CSS [css]
db.users.createIndex[{email:1},{unique:true}];
6Code language: JavaScript [javascript]
db.users.insertMany[[ { email: "john@test.com", name: "john"}, { email: "jane@test.com", name: "jane"}, ]];
Nó hoạt động vì chỉ mục
1 chỉ kiểm tra sự trùng lặp của sự kết hợp giữa các giá trị vĩ độ và vĩ độCode language: CSS [css]
db.users.insertOne[ { email: "john@test.com", name: "johny"} ];