Xung đột MongoDB ObjectId

MongoDB là một cơ sở dữ liệu NoSQL hoạt động với các bộ sưu tập và tài liệu. Mỗi tài liệu được tạo trên MongoDB có một thuộc tính ID đối tượng duy nhất. Vì vậy, khi tạo tài liệu mà không cần nhập ID, tài liệu sẽ được tạo bằng ID được tạo tự động

Ai tạo ID?

Khi điền thuộc tính của tài liệu, chúng ta không nhất thiết phải nhập ID đối tượng. Nhưng khi chúng ta tham khảo MongoDB sau khi tạo một tài liệu, nó sẽ có ID đối tượng giống như thế này

{ 
“_id”: “5f1819229fdf8a0c7c2d8c36”
}

Điều này giúp chúng tôi tạo tài liệu trong MongoDB dễ dàng hơn nhiều và tiết kiệm rất nhiều thời gian. ID đối tượng trong các tài liệu trong MongoDB được tạo bởi trình điều khiển MongoDB, nói chuyện với MongoDB. Vì vậy, điều này mang lại rất nhiều lợi thế

  • Bạn không cần đợi MongoDB tạo mã định danh duy nhất mới
  • Các ứng dụng của MongoDB có khả năng mở rộng cao
  • Bạn có thể tạo một số phiên bản của MongoDB
  • Không cần phải nói chuyện với một nơi trung tâm để có được một mã định danh duy nhất

Thuộc tính của ID đối tượng

ID đối tượng dài 24 ký tự với hai ký tự chiếm tối đa một byte, do đó chứa tổng cộng 12 byte. Đây là những gì 12 byte của ID đối tượng cho chúng ta biết

Dấu thời gian

Bốn byte đầu tiên của ID đối tượng biểu thị dấu thời gian khi tài liệu được tạo. Chúng tôi tránh phải tạo một thuộc tính riêng trong tài liệu, chẳng hạn như created-at và do đó có thể tiết kiệm thời gian và có các dòng mã được tối ưu hóa

Do sự đóng góp của dấu thời gian cho ID đối tượng, chúng tôi có thể có được thời gian khi tài liệu được tạo bằng cách chỉ tham khảo ID. Do đó, khi truy vấn dữ liệu, chúng tôi không cần một phương pháp khác để sắp xếp tài liệu theo dấu thời gian

Bạn có thể lấy dấu thời gian của một đối tượng bằng cách sử dụng các lệnh sau

const mongoose = require('mongoose');// Create object Id on memory
const id = new mongoose.Types.ObjectId();
// Get timestamp
console.log(id.getTimestamp());

mã định danh máy

Ba byte tiếp theo đại diện cho mã định danh máy (i. e. máy mà tài liệu được tạo trên đó). Giả sử hai tài liệu được tạo cùng lúc trên các máy khác nhau. Ba byte này sẽ khác nhau, làm tăng thêm tính duy nhất của ID đối tượng

định danh quy trình

Hai byte tiếp theo đại diện cho định danh quy trình (i. e. quy trình trong máy mà tài liệu được tạo trên đó). Giả sử hai tài liệu được tạo cùng lúc trên cùng một máy nhưng với các quy trình khác nhau. Hai byte này sẽ khác nhau, làm tăng thêm tính duy nhất của ID đối tượng

Phản đối

Ba byte cuối cùng đại diện cho một bộ đếm. Bộ đếm này là một số tăng tự động tương tự như các biến bộ đếm khác trong cơ sở dữ liệu SQL và NoSQL, làm cho ID đối tượng trở thành duy nhất (trong SQL, điều này có thể cản trở khả năng mở rộng). Giả sử hai tài liệu được tạo cùng lúc trên cùng một máy và trên cùng một quy trình. Các byte bộ đếm sẽ khác nhau, góp phần tạo nên tính duy nhất của ID đối tượng

Vấn đề ID đối tượng

Trong MongoDB, một vấn đề phát sinh với bộ đếm trong ID đối tượng có thể hạn chế tính duy nhất của nó

ID đối tượng chỉ là duy nhất miễn là bộ đếm không tràn

Sự cố tràn bộ đếm xảy ra khi bộ đếm đã đạt đến công suất tối đa, dẫn đến các tài liệu có cùng ID đối tượng. Do đó, ID đối tượng gần như là duy nhất nhưng không phải là duy nhất 100%

Đây là lý do tại sao. Bộ đếm đang được phân bổ ba byte. Điều này có nghĩa là nó có khả năng đại diện cho tới 16 triệu số. Nếu nhiều tài liệu đó được tạo cùng lúc, trên cùng một máy và cùng một quy trình, thì hai tài liệu có thể chia sẻ cùng một ID đối tượng

Sử dụng Mongoose

Khi xây dựng ứng dụng bằng Node. js và Express. js, chúng tôi sử dụng cầy mangut. Mongoose là một sự trừu tượng hóa trên trình điều khiển MongoDB. Do đó, khi tạo tài liệu, cầy mangut sẽ nói chuyện với trình điều khiển MongoDB để tạo ID đối tượng mới

Tạo ID đối tượng

// create an object id on memory - Not on DB!const mongoose = require('mongoose');const id = mongoose.Types.ObjectId();
console.log(id);
// output -> 5f1819229fdf8a0c7c2d8c36

Xác thực ID đối tượng

Với cầy mangut, bạn cũng có thể xác thực tĩnh ID đối tượng bằng cách sử dụng thuộc tính isValid

Phần kết luận

ID đối tượng MongoDB là duy nhất trừ khi đạt đến một kịch bản nhất định (đã thảo luận ở trên). Do đó, với tư cách là nhà phát triển phần mềm, chúng ta nên xem xét quy mô và độ phức tạp của hệ thống để đánh đổi giữa ID được tạo tự động và ID đối tượng tùy chỉnh

Cách tiếp cận hoàn toàn do bạn quyết định. Để biết thêm thông tin về ID đối tượng MongoDB, bạn có thể tham khảo tài liệu chính thức của MongoDB và Mongoose

Tôi hy vọng câu chuyện này đã giáo dục bạn về tính duy nhất và độ tin cậy của ID đối tượng trong MongoDB. Hãy vui vẻ học tập và tận hưởng mã hóa

ID MongoDB có phải là duy nhất trên các bộ sưu tập không?

Ràng buộc về tính duy nhất cho _id là trên mỗi bộ sưu tập, vì vậy có - một và cùng một ID có thể xuất hiện một lần trên mỗi Bộ sưu tập . Tuy nhiên, rất khó xảy ra, nếu không muốn nói là không thể, đối với cùng một ID được tạo hai lần. Vì vậy, để điều này xảy ra, bạn sẽ phải chèn các ID trùng lặp theo cách thủ công.

MongoDB có tự động tạo ID không?

Trình điều khiển cơ sở dữ liệu MongoDB theo mặc định, tạo mã định danh ObjectID được gán cho trường _id của từng tài liệu . Trong nhiều trường hợp, ObjectID có thể được sử dụng làm mã định danh duy nhất trong ứng dụng.

_ID được tạo như thế nào trong MongoDB?

Về mặt kiến ​​trúc, theo mặc định, trường _id là một ObjectID, một trong các loại BSON của MongoDB. ObjectID là khóa chính cho tài liệu được lưu trữ và được tạo tự động khi tạo tài liệu mới trong bộ sưu tập .

Được sử dụng để xác định tài liệu duy nhất?

Số nhận dạng duy nhất (UID) là số nhận dạng đánh dấu bản ghi cụ thể đó là duy nhất so với mọi bản ghi khác. Nó cho phép bản ghi được tham chiếu trong Chỉ mục triệu hồi mà không bị nhầm lẫn hoặc ghi đè không chủ ý từ các bản ghi khác.