MongoDB ghi đè _id

Trường _id MongoDB là một phần quan trọng của cấu trúc tài liệu. Trong bài viết này, chúng ta sẽ xem qua 10 phương pháp hay nhất để làm việc với trường _id MongoDB

MongoDB ghi đè _id

Dorothy Karras

Đã xuất bản ngày 27 tháng 10 năm 2022

MongoDB _id là loại BSON 12 byte, bao gồm dấu thời gian 4 byte, mã định danh máy 3 byte, mã định danh quy trình 2 byte và bộ đếm 3 byte. Trường _id được sử dụng làm khóa chính cho các bộ sưu tập trong MongoDB

Trong bài viết này, chúng ta sẽ thảo luận về 10 phương pháp hay nhất để làm việc với trường _id MongoDB. Những thực tiễn tốt nhất này sẽ giúp bạn tránh những lỗi phổ biến và tối ưu hóa ứng dụng của bạn để đạt hiệu suất

1. Sử dụng một _id duy nhất cho mỗi tài liệu

_id là khóa chính cho tài liệu MongoDB và nó phải là duy nhất trong bộ sưu tập. Giá trị của trường _id phải là duy nhất trên tất cả các tài liệu trong một bộ sưu tập, do đó, việc sử dụng cùng một _id cho hai tài liệu khác nhau trong cùng một bộ sưu tập sẽ dẫn đến lỗi

Nếu bạn không chỉ định _id khi chèn tài liệu, MongoDB sẽ tạo một tài liệu cho bạn. Tuy nhiên, tốt nhất là luôn chỉ định rõ ràng _id khi bạn chèn tài liệu để bạn có thể kiểm soát giá trị

Có một vài cách khác nhau để tạo _id duy nhất

– Sử dụng UUID
– Sử dụng số đơn điệu tăng dần
– Sử dụng hàm băm của nội dung tài liệu

2. Không sử dụng lại giá trị _id

Khi bạn chèn một tài liệu vào MongoDB, cơ sở dữ liệu sẽ tự động gán cho nó một trường _id nếu không được chỉ định. Giá trị của trường _id phải là duy nhất trong bộ sưu tập vì nó hoạt động như một khóa chính. Nếu bạn cố gắng chèn một tài liệu có _id đã tồn tại trong bộ sưu tập, MongoDB sẽ trả về lỗi

Mặc dù việc sử dụng lại giá trị _id rất hấp dẫn (ví dụ: khi bạn đang chèn một số lượng lớn tài liệu), nhưng làm như vậy có thể dẫn đến các sự cố sau này. Chẳng hạn, giả sử bạn có một tập hợp người dùng và mỗi người dùng có một trường _id với giá trị là 1. Nếu bạn cố cập nhật tài liệu của một người dùng cụ thể, bạn có thể vô tình cập nhật tất cả tài liệu trong bộ sưu tập vì tất cả chúng đều có cùng giá trị _id

Để tránh những loại lỗi này, hãy đảm bảo rằng bạn luôn tạo một giá trị _id mới cho mỗi tài liệu mà bạn chèn vào MongoDB

3. Tránh sử dụng trường _id làm khóa chính

Trường _id được MongoDB tự động tạo để xác định duy nhất từng tài liệu trong một bộ sưu tập. Nó được lập chỉ mục theo mặc định, vì vậy truy vấn nhanh chóng. Tuy nhiên, trường _id không phải là bất biến, có nghĩa là nó có thể thay đổi. Nếu bạn sử dụng trường _id làm khóa chính và giá trị của trường _id thay đổi, thì bạn sẽ không thể truy vấn tài liệu đó bằng giá trị _id ban đầu nữa

Tốt hơn là sử dụng một trường riêng biệt làm khóa chính của bạn, chẳng hạn như địa chỉ email hoặc tên người dùng. Bạn có thể lập chỉ mục trường này để thực hiện các truy vấn nhanh hơn. Và, nếu bạn cần thay đổi giá trị của trường, bạn có thể làm như vậy mà không ảnh hưởng đến khả năng truy vấn tài liệu của bạn

4. Chọn một giá trị _id có ý nghĩa

Trường _id là khóa chính cho tài liệu MongoDB và do đó, nó phải là duy nhất. Giá trị của trường _id phải là duy nhất trong bộ sưu tập, vì vậy bạn không thể có hai tài liệu có cùng giá trị _id

Nếu bạn không chỉ định giá trị _id khi chèn tài liệu, MongoDB sẽ tạo giá trị _id cho bạn. Tuy nhiên, tốt nhất là chỉ định giá trị _id của riêng bạn để bạn có thể kiểm soát giá trị đó là gì

Có một số điều cần lưu ý khi chọn giá trị _id

– Giá trị _id phải là duy nhất trong bộ sưu tập.
– Giá trị _id phải là bất biến (i. e. bạn không thể thay đổi nó sau khi nó được đặt).
– Giá trị _id phải là chuỗi thập lục phân 12 byte (tổng cộng 24 ký tự).

5. Cân nhắc sử dụng UUID hoặc giá trị dựa trên hàm băm

Giá trị _id MongoDB mặc định là ObjectID 12 byte. Mặc dù điều này mang lại một số lợi ích về hiệu quả và hiệu suất không gian, nhưng cũng có một số nhược điểm. Ví dụ: ObjectID là tuần tự, có nghĩa là chúng có thể đoán được. Chúng cũng không thân thiện với người dùng, điều này có thể gây khó khăn khi làm việc với chúng

Mặt khác, UUID là các giá trị 16 byte được tạo bằng trình tạo số ngẫu nhiên hoặc giả ngẫu nhiên. Điều này làm cho chúng khó đoán hơn nhiều và chúng cũng thân thiện với người dùng hơn. Các giá trị dựa trên hàm băm cung cấp các lợi ích tương tự, nhưng chúng có thể ít thân thiện với người dùng hơn

Cuối cùng, quyết định sử dụng ObjectID, UUID hay giá trị dựa trên hàm băm sẽ tùy thuộc vào nhu cầu và yêu cầu cụ thể của bạn. Tuy nhiên, nếu lo ngại về tính bảo mật hoặc khả năng sử dụng, bạn nên xem xét một trong các lựa chọn thay thế

6. Tạo các giá trị _id ở phía máy khách

Trường _id MongoDB là khóa chính và do đó, nó phải là duy nhất. Nếu bạn cho phép cơ sở dữ liệu tạo các giá trị _id, thì sẽ có khả năng (dù nhỏ) là hai máy khách có thể có cùng một giá trị _id. Điều này sẽ gây ra sự cố, vì vậy tốt nhất nên tránh hoàn toàn bằng cách tạo các giá trị _id ở phía máy khách

Để tạo giá trị _id ở phía máy khách, bạn có thể sử dụng hàm ObjectId(). Hàm này lấy một chuỗi 12 byte làm đối số và trả về giá trị _id. Chuỗi 12 byte có thể được tạo bằng nhiều phương pháp, nhưng phổ biến nhất là sử dụng trình tạo số ngẫu nhiên được bảo mật bằng mật mã

7. Không sửa đổi trường _id

Trường _id được sử dụng để xác định duy nhất một tài liệu trong bộ sưu tập MongoDB. Nó cũng được sử dụng để lập chỉ mục các tài liệu để có hiệu suất truy vấn nhanh hơn. Nếu bạn sửa đổi trường _id, thì trường đó sẽ không còn là duy nhất nữa và chỉ mục sẽ bị hỏng

Có thể thay đổi giá trị của trường _id nhưng không nên. Nếu bạn nhất định phải thay đổi trường _id, thì trước tiên bạn nên bỏ chỉ mục trên trường _id, thay đổi trường _id rồi tạo lại chỉ mục

8. Không tạo chỉ mục _id của riêng bạn

Chỉ mục _id được tạo tự động khi bộ sưu tập được tạo và nó luôn là chỉ mục đầu tiên trong danh sách chỉ mục cho bộ sưu tập. Chỉ mục _id là đặc biệt bởi vì

– Nó được đảm bảo là duy nhất
– Nó không thay đổi (không thể thay đổi)
– Nó được lập chỉ mục theo mặc định

Tạo chỉ mục _id của riêng bạn sẽ không cải thiện hiệu suất và nó thực sự có thể làm giảm hiệu suất vì hiện tại có hai chỉ mục _id phải được duy trì

9. Hãy cẩn thận với các trường Sharding và _id

Khi bạn phân đoạn một bộ sưu tập, trường _id phải được bao gồm trong khóa phân đoạn. Điều này là do trường _id được sử dụng để xác định duy nhất các tài liệu trong một bộ sưu tập và do đó, nó phải được sử dụng để xác định tài liệu thuộc về phân đoạn nào

Tuy nhiên, nếu bạn sử dụng trường _id làm khóa phân đoạn của mình, thì tất cả các ghi vào bộ sưu tập sẽ chuyển đến cùng một phân đoạn. Điều này có thể dẫn đến các vấn đề về hiệu suất, vì phân đoạn sẽ trở thành nút cổ chai

Do đó, điều quan trọng là chọn một khóa phân đoạn sẽ phân phối lưu lượng ghi đồng đều trên tất cả các phân đoạn. Một cách hay để làm điều này là sử dụng khóa phân đoạn phức hợp, trong đó trường _id được kết hợp với một trường khác có số lượng thẻ cao (i. e. một số lượng lớn các giá trị duy nhất)

10. Hiểu cách _id hoạt động trong bộ bản sao

Khi một tài liệu được chèn vào bộ sưu tập MongoDB, cơ sở dữ liệu sẽ tự động tạo trường _id nếu không được cung cấp. Giá trị của trường _id phải là duy nhất trong bộ sưu tập nhưng không nhất thiết phải là duy nhất trên toàn cầu. Điều này có nghĩa là hai tài liệu trong các bộ sưu tập khác nhau có thể có cùng giá trị _id

Trường _id cũng được sử dụng làm khóa phân đoạn mặc định cho bộ sưu tập. Trong một bộ bản sao, mỗi tài liệu phải có một giá trị _id duy nhất để bộ bản sao có thể đồng bộ hóa chính xác. Nếu hai tài liệu trong một bộ bản sao có cùng giá trị _id, thì một trong các tài liệu sẽ bị ghi đè bởi tài liệu kia và dữ liệu sẽ bị mất

Để tránh điều này, điều quan trọng là phải hiểu cách trường _id hoạt động trong bộ bản sao và đảm bảo rằng tất cả tài liệu trong bộ bản sao có giá trị _id duy nhất

Trước

10 Thực tiễn Tốt nhất về Chia sẻ Bên ngoài SharePoint

Quay lại Thông tin chi tiết

Tiếp theo

10 phương pháp hay nhất cho cuộn phim trên Instagram

MongoDB ghi đè _id

Dorothy Karras

Dorothy Karras là một chuyên gia về MongoDB và đã làm việc với cơ sở dữ liệu hơn 5 năm. Cô đã viết nhiều bài báo và hướng dẫn về các phương pháp hay nhất, tối ưu hóa hiệu suất và khả năng mở rộng

Tôi có nên ghi đè _id trong MongoDB không?

Ghi đè trường _id có nghĩa là bạn sẽ cần tạo một giá trị duy nhất cho tài liệu của mình. Mặc dù bạn có thể sử dụng UUID hoặc một số mã định danh duy nhất khác cho ứng dụng của mình, nhưng tốt nhất là cho phép MongoDB sử dụng giá trị mặc định của nó nếu bạn không chắc trường thay thế của mình là duy nhất.

Làm cách nào để thay thế _id trong MongoDB?

ASP. NET Core 3 MVC với MongoDB .
Bước 1. Ở bước đầu tiên, bạn cần lưu trữ ObjectId vào một biến
Bước 2. Trong bước thứ hai, bạn cần đặt id mới
Bước 3. Ở bước thứ ba, bạn cần chèn id mới vào tài liệu
Bước 4. Ở bước thứ tư, bạn cần xóa id cũ

Chúng tôi có thể xóa _id trong MongoDB không?

MongoDB tạo một chỉ mục duy nhất trên trường _id trong quá trình tạo bộ sưu tập. Chỉ mục _id ngăn khách hàng chèn hai tài liệu có cùng giá trị cho trường _id. Bạn không thể bỏ chỉ mục này vào trường _id .

_id trong MongoDB là gì?

Trường _id . Nếu một tài liệu được chèn bỏ qua trường _id, trình điều khiển MongoDB sẽ tự động tạo một ObjectId cho trường _id. each document stored in a collection requires a unique _id field that acts as a primary key. If an inserted document omits the _id field, the MongoDB driver automatically generates an ObjectId for the _id field.