2012-12-27 5 views
19

MongoDB sử dụng loại ObjectId cho _id.Có xấu khi thay đổi loại _id trong MongoDB thành số nguyên không?

Sẽ xấu nếu tôi tạo _id một số nguyên tăng?

(Với this đá quý, nếu bạn quan tâm)

+0

Nó thực sự phụ thuộc. Có một đối số không vì nó là một id duy nhất (tự động gia tăng) nhưng sau đó có một cho yes vì ​​phí bảo trì cần thiết để giữ id duy nhất (phải truy vấn bộ sưu tập bộ đếm khác). Nó giống như phải kiểm tra tính duy nhất của tất cả các _ids trước khi bạn chèn chúng, nó cuối cùng cản trở tỷ lệ chèn và tạo khóa kéo dài. – Sammaye

+0

Hmm, có quá nhiều hành động trong DB cho tính năng đơn giản này? = ( –

+0

Yea khá một vài vì dĩ nhiên MongoDB không có ý nghĩa của một id tăng tự động phía máy chủ, bạn có thể xem ở đây cho những gì nó cần để thực hiện một: http: //docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/infact Đây là một trong những lý do tại sao MongoDB không hỗ trợ kiểu máy chủ id này – Sammaye

Trả lời

20

Không hề tệ chút nào và thực tế việc xây dựng trong OjbectId khá lớn trong chỉ mục vì vậy nếu bạn tin rằng bạn có thứ gì đó tốt hơn thì bạn được hoan nghênh thay đổi giá trị mặc định của trường _id thành bất kỳ thứ gì .

Nhưng, và đây là một lớn nhưng, có một số cân nhắc khi quyết định di chuyển ra khỏi mặc định xây dựng ObjectId, đặc biệt là khi sử dụng auto incrementing _ids như ở đây: http://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/#auto-increment-counters-collection

đa luồng isn' một vấn đề lớn như vậy bởi vì findAndModify và các khóa nguyên tử thực sự có thể chăm sóc điều đó, nhưng sau đó bạn chỉ cần nhấn vào vấn đề đầu tiên của bạn. findAndModify không phải là chức năng nhanh nhất cũng không phải là nhẹ nhất và đã có hiệu suất đáng kể giảm nhận thấy khi sử dụng nó thường xuyên.

Bạn cũng phải tự mình cân nhắc việc tự mình thực hiện việc này, ngay cả khi không có findAndModify. Đối với mỗi chèn bạn có, bạn sẽ cần phải làm một truy vấn thêm. Hình ảnh có một id duy nhất mà bạn phải truy vấn tính duy nhất của mỗi lần bạn muốn chèn, cuối cùng tỷ lệ chèn của bạn sẽ giảm xuống thu thập dữ liệu và khóa của bạn sẽ tích tụ. Tất nhiên ObjectId thực sự tốt là duy nhất mà không cần phải kiểm tra hoặc xây dựng tính độc đáo của riêng nó bằng cách chạm vào cơ sở dữ liệu trước khi chèn, do đó nó không có chi phí này.

Điều đó được cho là nó không phải là ý tưởng tồi tệ nhất trên thế giới và nếu bạn nghĩ rằng nó bao gồm kịch bản của bạn thì hãy tìm nó, nhưng hãy nhớ rằng nếu bạn không yêu cầu id tăng tự động, nó có thể là gánh nặng cho bạn .

7

Bạn có thể làm điều đó, nhưng bạn có trách nhiệm để đảm bảo rằng các số nguyên là duy nhất.

MongoDB không hỗ trợ các trường tăng tự động như hầu hết các cơ sở dữ liệu SQL. Khi bạn có một ứng dụng phân tán hoặc đa luồng có nhiều tiến trình và/hoặc luồng tạo các mục cơ sở dữ liệu mới, bạn phải đảm bảo rằng chúng sử dụng cùng một bộ đếm. Nếu không nó có thể xảy ra rằng hai chủ đề cố gắng lưu trữ một tài liệu với cùng một _id trong cơ sở dữ liệu.

Khi điều đó xảy ra, một trong số đó sẽ không thành công. Điều đó có nghĩa là bạn phải đợi cơ sở dữ liệu trả lại thành công hoặc lỗi (bằng cách gọi GetLastError hoặc bằng cách đặt các mối quan tâm viết thành được thừa nhận), việc này mất nhiều thời gian hơn là gửi dữ liệu theo cách lửa và quên.