Tôi có một trường ID duy nhất thuộc loại int
trong tài liệu của mình. Tôi đang làm ensureIndex
trên trường này, nhưng tài liệu của tôi vẫn chứa _id
. Tôi có thể loại bỏ nó không?MongoDB: có thể tránh sử dụng trường _id tự động không?
Trả lời
Từ docs ...
Nếu người dùng cố gắng để chèn một tài liệu mà không cung cấp một lĩnh vực _id, cơ sở dữ liệu sẽ tự động tạo ra một đối tượng idvà lưu nó lĩnh vực _id.
Tuy nhiên, bạn có thể gán giá trị của riêng bạn để _id ...
Giá trị _id có thể của bất kỳ loại, trừ mảng, miễn là nó là một độc đáo.
Câu hỏi tốt hơn là lý do tại sao bạn sẽ tạo ID duy nhất của riêng mình, xây dựng một chỉ mục trên nó và loại bỏ các ObjectId rất hữu ích _id được tự động lập chỉ mục?
Tất cả các trình điều khiển chính thức sử dụng ObjectId và nó có rất nhiều khía cạnh thực sự tốt với nó:
Nó đã một dấu thời gian xây dựng trong (do đó bạn không cần phải lưu trữ một trường ngày tại của bạn tài liệu, và bạn có thể sử dụng nó để đặt hàng theo ngày.)
Đây là "số thứ tự toàn cầu tăng dần" --- nghĩa là nó sẽ vẫn là duy nhất trên các máy chủ nếu bạn cần phân đoạn dữ liệu của mình, v.v.
Không, bạn không thể loại bỏ nó, it is there by design, nhưng bạn có thể ánh xạ số nhận dạng duy nhất của mình int
lên chính số _id
khi chèn tài liệu.
Một ý tưởng hay là lưu trữ hàm băm của bạn vào trường _id.
Do đó, cơ sở dữ liệu sẽ không tự động tạo trường _id vì nó đã tồn tại và bạn sẽ tiết kiệm không gian của chỉ mục không sử dụng.
Chỉ cần đặt trường _id là bất kỳ trường nào khác với giá trị bạn muốn (ví dụ: hàm băm của bạn). Nhưng hãy cẩn thận, nó cần phải là duy nhất!
Để đảm bảo tính duy nhất bạn có nên làm cho nó độc đáo hoặc đặt một subdocument trong lĩnh vực _id: {_id: {h: [yourHash], u: [a định danh duy nhất]} ...}
Đó là chính xác những gì tôi đã làm, giết chết hai con chim với một shot: tài liệu của tôi không chứa ObjectID lớn, và tôi không cần phải gọi 'EnsureIndex' sau mỗi lần chèn - tôi nhận được một tốc độ đáng kể (tôi sẽ không bao giờ nghĩ rằng' EnsureIndex 'rất chậm). –
@Violet Giraffe: Không cần phải gọi 'EnsureIndex' sau mỗi lần chèn - nó chỉ cần được gọi một lần trong vòng đời của cơ sở dữ liệu, giống như với MySQL. Ngoài ra, 'ObjectID' không thực sự là một lĩnh vực 'rất lớn'. Tuy nhiên, tôi đồng ý rằng việc sử dụng một hàm băm có ý nghĩa. Trong cuộc thảo luận về hàm băm so với id đối tượng so với guid, hãy đảm bảo rằng bạn hiểu được những tác động lâu dài của sự kết hợp và các khóa phân đoạn tiềm năng. – mnemosyn
- 1. Mongodb chèn tài liệu không có trường _id
- 2. Các trường _id mặc định cho các tài liệu MongoDB luôn có 24 ký tự hex?
- 3. mongoose (mongodb) Alias _id field
- 4. mongodb $ not _id
- 5. Có giới hạn về độ dài _id trong mongodb
- 6. Tự hỏi: MongoDB _id có phải là duy nhất theo mặc định không?
- 7. Có cách nào để tạo mongodb như _id dây mà không mongodb?
- 8. Có thể buộc một thuộc tính tự động sử dụng trường sao lưu chỉ đọc không?
- 9. LoạiError: Không thể đọc thuộc tính '_id' không xác định
- 10. Cập nhật Mongodb. setOnInsert Mod on _id không được phép
- 11. Microsoft Access có thể tự động điền các trường không?
- 12. MongoDB: đầu ra 'id' thay vì '_id'
- 13. Upserts in mongodb khi sử dụng các giá trị _id tùy chỉnh
- 14. MongoDB chọn vị trí trong mảng _id?
- 15. Mongoose truy xuất dữ liệu mà không có trường _id
- 16. Có cách nào để sử dụng khóa động với nút-mongodb-native không?
- 17. Tại sao tôi không thể tìm thấy hồ sơ bằng _id trong mongodb
- 18. Có cách nào để tránh tự động cập nhật các trường dấu thời gian Rails không?
- 19. Trong mongodb, cần báo giá xung quanh các phím cho các hoạt động CRUD, ví dụ: "_id" so với _id?
- 20. Tôi có thể sử dụng String làm loại ID cho tài liệu mongodb không?
- 21. Sự khác biệt giữa các trường "id" và "_id" trong MongoDB
- 22. Có thể cấu hình tên trường mặc định của ObjectId trong MongoDB không?
- 23. Nodejs, mongodb - sử dụng $ nin hoặc $ cho id đối tượng hoặc _id
- 24. Sao chép tài liệu trong MongoDB bằng cách sử dụng một _id
- 25. có thể tự động sửa lỗi trong Android mà không cần sử dụng thị trường Android không?
- 26. MongoDB: Cách đặt trường khác (khác với _id) làm ID của tài liệu mongo?
- 27. Khuôn khổ tập hợp MongoDB - Đổi tên trường động
- 28. Có xấu khi thay đổi loại _id trong MongoDB thành số nguyên không?
- 29. Xóa bởi _id trong bảng điều khiển MongoDB
- 30. Ember, dữ liệu Ember và MongoDB của _id
Thank bạn! Tôi mới đến MongoDB và tôi đã bỏ lỡ phần tài liệu bạn đã trích dẫn. Và cảm ơn vì đã giải thích những lợi ích của việc sử dụng ObjectID. Tuy nhiên, tôi muốn sử dụng ID của tôi bởi vì nó là một băm (và tôi cần phải lưu trữ nó trong tài liệu của tôi anyway), và nó nhỏ hơn ObjectID. –
Rất vui được trợ giúp, rõ ràng là về những gì tốt nhất cho ứng dụng của bạn nhưng tôi thấy ObjectID rất hữu ích trong một số tình huống mà tôi không nghĩ đến khi lần đầu tiên tôi bắt đầu. Vui lòng, http://learnmongo.com cũng có thể hữu ích cho bạn! –
Cảm ơn bạn đã liên kết tuyệt vời! –