2011-11-11 21 views

Trả lời

4

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.

+0

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. –

+1

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! –

+0

Cảm ơn bạn đã liên kết tuyệt vời! –

2

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.

2

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]} ...}

+0

Đó 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). –

+1

@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

Các vấn đề liên quan