Trong MongoDB, trường _id làm khóa chính cho bộ sưu tập để mỗi tài liệu có thể được xác định duy nhất trong bộ sưu tập. Trường _id chứa một giá trị ObjectID duy nhất
Mặc định khi chèn tài liệu vào trong collection nếu bạn không thêm tên trường có _id vào tên trường thì MongoDB sẽ tự động thêm trường Object id như hình bên dưới
Khi bạn truy vấn tài liệu trong bộ sưu tập, bạn có thể xem ObjectId cho từng tài liệu trong bộ sưu tập
Nếu bạn muốn đảm bảo rằng MongoDB không tạo Trường _id khi bộ sưu tập được tạo và nếu bạn muốn chỉ định id của chính mình làm _id của bộ sưu tập, thì bạn cần xác định rõ ràng điều này trong khi tạo bộ sưu tập
Khi tạo một trường id một cách rõ ràng, nó cần được tạo với _id trong tên của nó
Hãy xem một ví dụ về cách chúng ta có thể đạt được điều này
db.Employee.insert[{_id:10, "EmployeeName" : "Smith"}]
Giải thích mã
- Chúng tôi giả định rằng chúng tôi đang tạo tài liệu đầu tiên trong bộ sưu tập và do đó, trong câu lệnh trên khi tạo bộ sưu tập, chúng tôi xác định rõ ràng trường _id và xác định giá trị cho nó
Nếu lệnh được thực hiện thành công và bây giờ sử dụng lệnh find để hiển thị các tài liệu trong bộ sưu tập, Kết quả sau sẽ được hiển thị
đầu ra
Kết quả hiển thị rõ ràng rằng trường _id mà chúng tôi đã xác định khi tạo bộ sưu tập hiện được sử dụng làm khóa chính cho bộ sưu tập
[Các] ObjectId được tạo tự động bởi Trình điều khiển MongoDB, không phải cơ sở dữ liệu MongoDB. Nó được sử dụng để xác định duy nhất một tài liệu trong cơ sở dữ liệu
Khi chúng tôi xây dựng một ứng dụng với NodeJS và Express, chúng tôi sử dụng Mongoose, một bản tóm tắt trên MongoDB Driver. Mongoose trao đổi với MongoDB Driver để tạo một ObjectId mới
1. Cấu trúc của ObjectId'_id': '5q6ffe6a0ba62570agcedd68'
Cấu trúc của ObjectId [Nguồn. https. //Blog. eduonix. com/]
Mỗi ObjectId bao gồm 24 ký tự. Hơn nữa, cứ sau 2 ký tự đại diện cho một byte. Vì vậy, nó bao gồm tổng cộng 12 byte. Từ trái sang phải
- 4 byte. Dấu thời gian
- 3 byte. mã định danh máy
- 2 byte. định danh quy trình
- 3 byte. Phản đối
Chúng ta sẽ thảo luận chi tiết về tất cả những thứ này [12 byte], ở phần sau của bài viết này
💡 Trước đó, chúng ta cần biết ObjectId này được tạo khi nào?
…Có một sự nhầm lẫn rằng [các] ObjectId được tạo ra khi chúng ta lưu tài liệu vào cơ sở dữ liệu MongoDB bằng cách sử dụng phương thức save[] của Mongoose. Nếu bạn nghĩ giống nhau, bạn có thông tin sai
Câu trả lời. ObjectId được tạo khi chúng ta khởi tạo một tài liệu mới bằng lớp mô hình Mongoose
Giả sử một mô hình cầy mangut có tên là Course và chúng tôi muốn tạo một tài liệu 'khóa học' mới cho mô hình này
const course = new Course[{
name : 'Future of APIs',
tutor: 'Jane Doe',
}];await course.save[];
Thời điểm chúng tôi khởi tạo tài liệu bằng từ khóa mới, Trình điều khiển MongoDB sẽ tạo objectId cho tài liệu cụ thể đó
Ghi chú. Đó là một cách tốt để tránh đặt lại biến tài liệu, nghĩa là 'khóa học' trong ví dụ của chúng tôi, trong khi lưu nó vào cơ sở dữ liệu. Chúng tôi thường đặt lại và khởi tạo lại biến này để trả lại cho khách hàng
1. 1 dấu thời gian
'_id': '5q6ffe6a0ba62570agcedd68'
8 ký tự đầu tiên, nghĩa là 4 byte đại diện cho dấu thời gian tạo tài liệu
Chúng tôi có thể trích xuất dấu thời gian này từ ObjectId. Làm sao?
const timestamp = _id.getTimestamp[];
Vì vậy, chúng ta không cần tạo một thuộc tính riêng trong cơ sở dữ liệu, như createdAt, để đặt trước khi đối tượng được tạo
1. 2 Mã định danh máy
'_id': '5q6ffe6a0ba62570agcedd68'
3 byte tiếp theo đại diện cho một mã định danh máy
Hai máy khác nhau sẽ có số nhận dạng khác nhau. Không có gì nhiều để nói về điều này
1. 3 Định danh quy trình
________số 8
2 byte tiếp theo được dành riêng để xác định quá trình. Nếu chúng ta tạo hai ObjectId trên cùng một máy nhưng trong các quy trình khác nhau, thì 2 byte này sẽ khác nhau
1. 4 quầy
'_id': '5q6ffe6a0ba62570agcedd68'
Cuối cùng, 3 byte cuối cùng đại diện cho bộ đếm gia tăng. Nếu chúng ta tạo hai ObjectId có cùng 18 ký tự đầu tiên hoặc cùng thông số kỹ thuật đã nêu ở trên, thì ba byte cuối cùng sẽ khác
Nó tương đương với thuộc tính cột tăng tự động trong cơ sở dữ liệu SQL
2. Tạo rõ ràng một ObjectId______3Chúng ta có thể tạo một ObjectId một cách rõ ràng bằng cách sử dụng lớp ObjectId của cầy mangut. Lớp này có một vài phương thức tĩnh khác, chẳng hạn như
- lấy Dấu thời gian[]
- isValid[]
Chúng ta đã thảo luận về phương thức getTimestamp[] ở trên trong phần 1. 1
Phương thức isValid[] được sử dụng để xác minh xem một ObjectId có được chấp nhận hay không. Chúng tôi có thể sử dụng phương pháp này khi chúng tôi nhận được ID từ người dùng để xóa hoặc cập nhật tài liệu
if[ ! mongoose.Types.ObjectId.isValid[ req.body.courseID ] ]
return res.status[400];
Đó là một cách thực hành tốt để sử dụng phương thức isValid[] với các thao tác CRUD cầy mangut sau đây. findById[], findByIdAndUpdate, findByIdAndDelete[] và findByIdAndRemove[]
3. Những điều lý thú💡 “Giá trị của _id là duy nhất trên tất cả các cơ sở dữ liệu MongoDB trên thế giới. ”
Tuyên bố trên có đúng không?
Có thể có nhiều ObjectId giống hệt nhau. Nhưng nó rất hiếm
Làm sao?