2012-04-19 51 views
8

Bối cảnh: Tôi đang dùng một ứng dụng (kỹ sư gốc rời) hoạt động như bộ nhớ đệm của một số dịch vụ phụ trợ tương đối chậm. Bởi vì đó là URL kiểu RESTful, mỗi URL là duy nhất. Ứng dụng sử dụng MongoDb làm bộ nhớ cache và sử dụng giá trị băm làm bộ đệm. Mặc dù mã băm phải khá độc đáo, nhưng nó không phải là duy nhất.Có giới hạn về độ dài _id trong mongodb

Câu hỏi: Tôi được cho biết lý do sử dụng mã băm (thay vì url) là do trường _id của MongoDb có giới hạn về độ dài, nhưng tôi không thể tìm thấy bất kỳ tài liệu nào về điều đó. Tất cả những gì tôi có thể tìm thấy trong tài liệu MongoDb là "_id field có thể là bất kỳ thứ gì khác ngoài mảng miễn là nó là duy nhất". Có đúng là trường _id của MongoDb có giới hạn độ dài không? Nếu vậy kích thước giới hạn là bao nhiêu?

Ứng dụng được viết bằng Java. Oh, và tôi mới đến MongoDb.

Trả lời

11

Có giới hạn về độ dài của trường được lập chỉ mục, là 1024 byte. Đó là một hạn chế về kích thước mục nhập chỉ mục thay vì kích thước trường tài liệu được giới hạn ở ~ 16MB (kích thước tối đa của một tài liệu hoàn chỉnh).

Vì lý do hiệu suất, bạn không thực sự muốn giá trị trường lớn cho các trường được lập chỉ mục khi so sánh với các giá trị lớn như vậy chậm hơn đáng kể. Cũng nên nhớ rằng mọi chỉ mục duy trì các bản sao của các giá trị được lập chỉ mục để nó đòi hỏi một lượng đáng kể bộ nhớ. Điều đó lần lượt có nghĩa là truy cập đĩa thường xuyên hơn để trao đổi các trang bộ nhớ ảo trong và ngoài bộ nhớ mà lại có tác động tiêu cực đến hiệu năng.

Vì vậy, có, giới hạn 800 byte.

+0

Ah, cảm ơn. Yea giá trị chuỗi dài trong _id là vụng về quá. Giải pháp thực sự là xử lý va chạm, nhưng đó là toàn bộ câu chuyện khác. – Alvin

+0

Cũng bởi các giá trị băm rất tự nhiên của chúng hiếm khi được đảm bảo là duy nhất. Như vậy tôi sẽ không lưu trữ băm dưới dạng giá trị _id (được yêu cầu là duy nhất) và không cần phải kiểm tra va chạm. Điều đó nói rằng nó hoàn toàn có thể tạo ra các url được rút ngắn cho các URI REST của bạn, nó sẽ yêu cầu một số nhận thức về ứng dụng trong mã rút gọn của bạn. –

+0

Cảm ơn lời khuyên! Cảm kích điều đó. – Alvin

3

Va chạm băm nên rất hiếm nếu bạn đang sử dụng hàm băm tốt với giá trị băm đủ dài. Ví dụ: nếu giá trị băm của bạn xuất ra giá trị 128 bit, bạn thường sẽ nhận được một va chạm sau khi tạo 2^64 băm - vì vậy nếu bạn tạo ra một triệu băm trong một giây, bạn sẽ bị va chạm sau khoảng 600.000 năm. Điều này có lẽ đủ tốt cho hầu hết các mục đích.

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