MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Khả năng trùng lặp Mongo ObjectId được tạo trong hai bộ sưu tập khác nhau?

Câu trả lời ngắn

Chỉ để thêm câu trả lời trực tiếp cho câu hỏi ban đầu của bạn:CÓ, nếu bạn sử dụng tạo ID đối tượng BSON, thì đối với hầu hết các trình điều khiển các ID gần như chắc chắn sẽ là duy nhất trên các bộ sưu tập. Xem bên dưới để biết "gần như chắc chắn" nghĩa là gì.

Câu trả lời dài

ID đối tượng BSON được tạo bởi trình điều khiển Mongo DB có nhiều khả năng là duy nhất trên các bộ sưu tập. Điều này chủ yếu là do 3 byte cuối cùng của ID, mà đối với hầu hết các trình điều khiển được tạo ra thông qua một bộ đếm gia tăng tĩnh. Bộ đếm đó không phụ thuộc vào bộ sưu tập; nó toàn cầu. Ví dụ, trình điều khiển Java sử dụng AtomicInteger tĩnh, được khởi tạo ngẫu nhiên.

Vậy tại sao, trong tài liệu Mongo, họ lại nói rằng các ID "có khả năng cao" là duy nhất, thay vì nói thẳng rằng chúng SẼ là duy nhất? Ba khả năng có thể xảy ra mà bạn sẽ không nhận được một ID duy nhất (vui lòng cho tôi biết nếu có thêm):

Trước cuộc thảo luận này, hãy nhớ lại rằng ID đối tượng BSON bao gồm:

[4 byte giây kể từ kỷ nguyên, 3 byte băm máy, 2 byte ID quy trình, bộ đếm 3 byte]

Dưới đây là ba khả năng, để bạn tự đánh giá khả năng mắc phải một bản dupe:

1) Tràn bộ đếm:có 3 byte trong bộ đếm. Nếu bạn tình cờ chèn hơn 16,777,216 (2 ^ 24) tài liệu trong một giây, trên cùng một máy, trong cùng một quá trình, thì bạn có thể làm tràn byte bộ đếm tăng dần và kết thúc bằng hai ID đối tượng dùng chung một thời gian, máy , xử lý và truy cập các giá trị.

2) Bộ đếm không tăng:một số trình điều khiển Mongo sử dụng số ngẫu nhiên thay vì số tăng dần cho các byte bộ đếm. Trong những trường hợp này, có 1 / 16.777.216 cơ hội tạo ID không phải duy nhất, nhưng chỉ khi hai ID đó được tạo trong cùng một giây (tức là trước khi phần thời gian của ID cập nhật vào giây tiếp theo), trên cùng một máy, trong cùng một quy trình.

3) Máy và quá trình băm có cùng giá trị. Các giá trị ID máy và ID quy trình, trong một số trường hợp rất khó xảy ra, có thể ánh xạ đến các giá trị giống nhau cho hai máy khác nhau. Nếu điều này xảy ra và đồng thời hai bộ đếm trên hai máy khác nhau, trong cùng một giây, tạo ra cùng một giá trị, thì bạn sẽ nhận được một ID trùng lặp.

Đây là ba tình huống cần đề phòng. Kịch bản 1 và 3 có vẻ rất khó xảy ra, và kịch bản 2 hoàn toàn có thể tránh được nếu bạn đang sử dụng đúng trình điều khiển. Bạn sẽ phải kiểm tra nguồn của trình điều khiển để biết chắc chắn.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Kết nối lại với MongoDB một cách đáng tin cậy

  2. Kiểu nhúng Golang + MongoDB (nhúng một cấu trúc vào một cấu trúc khác)

  3. Hướng dẫn của nhà phát triển về bộ bản sao MongoDB

  4. loại bỏ _id khỏi kết quả mongo

  5. Tìm tài liệu có mảng chứa một giá trị cụ thể