2013-04-06 39 views
6

Ví dụ: nếu tôi muốn có Tên người dùng là ID duy nhất của tài liệu mongo của tôi thay vì có "_id" mặc định?MongoDB: Cách đặt trường khác (khác với _id) làm ID của tài liệu mongo?

Tôi muốn đạt được điều này bằng giao diện điều khiển mongo.exe.

+2

Nếu tên người dùng có thể thay đổi và chúng được sử dụng trong các tài liệu khác, tôi khuyên bạn không nên đặt khóa chính ('_id') vì bạn cần cập nhật tất cả các vị trí trỏ đến tên người dùng mới (và bạn sẽ gặp vấn đề về thời gian vì không có giao dịch trong MongoDB). – WiredPrairie

Trả lời

14

MongoDB yêu cầu thuộc tính _id làm khóa chính duy nhất mà nó tự động lập chỉ mục.

Bạn có hai lựa chọn:

  1. Sử dụng các tài sản _id và đặt nó với tên người dùng.
  2. Tạo thuộc tính tên người dùng, sau đó thêm chỉ mục trên thuộc tính mới đó. Bạn vẫn sẽ có _id, nhưng có thể truy vấn bằng tên người dùng.
+1

Tôi biết, có thể có hồ sơ như {tên người dùng: "John", tuổi: 12}. Ý tôi là, không có _id. làm như thế nào? – Andrei

+2

Tại sao bạn muốn xóa _id? – cirrus

+3

Khi bạn xác định chỉ mục tên người dùng, bạn có thể yêu cầu nó là duy nhất, nếu đó là mối quan tâm của bạn. _id nhỏ và hữu ích. Chỉ cần để nó một mình và bỏ qua nó cho đến khi bạn hiểu mongodb tốt hơn nhiều. – Leopd

0

tôi biết, rằng nó có thể có kỷ lục như vậy như {username: "John", tuổi: 12}. Ý tôi là, không có _id. làm như thế nào?

Tôi không chắc chắn cách câu trả lời @Serges chưa đủ rõ ràng, để lặp lại, không có cách nào. Về mặt kỹ thuật, bạn vẫn có thể đưa ra _id trong một bộ sưu tập giới hạn trong một số phiên bản của MongoDB tuy nhiên, khác hơn là bạn không thể.

Ngoài ra tôi quan tâm đến việc bạn sử dụng tên người dùng, nó có thể không phải là điều tốt nhất cho các hoạt động như sharding và có thể tạo ra "điểm nóng" của acitivty cao trên cụm vv, đó là tất cả lý thuyết vì tôi không ở vị trí của bạn với dữ liệu của bạn, tuy nhiên, tốt nhất là nên xem xét nội dung này.

+0

Cảm ơn câu trả lời, nhưng tôi chỉ muốn biết, làm thế nào là có thể. Hãy để tôi cung cấp thêm một số chi tiết. Tôi đang sử dụng trình điều khiển .NET và tôi có thể viết mã như sau: lớp Người dùng { [BsonId] chuỗi công cộng Tên người dùng {get; bộ; } chuỗi công khai Mật khẩu {get; bộ; } } Khi tôi đặt đối tượng của lớp đó vào mongodb, tôi nhận được đối tượng mà không có _id, và tôi tò mò muốn biết, trình điều khiển giải thích đối tượng này như thế nào. Làm thế nào để hoạt động như thế nào? – Andrei

+0

@AndreiMikhalevich Chờ đợi, "Khi tôi đặt đối tượng của lớp như vậy vào mongodb, tôi nhận được đối tượng mà không có _id," bạn có ý nghĩa gì? Bạn đang nói rằng bạn đang lưu một đối tượng với _id và nó không có _id trong cơ sở dữ liệu? Đó là nghĩa vụ phải là không thể – Sammaye

+0

@AndreiMikhalevich: Nếu bạn chèn một đối tượng không có '_id', trình điều khiển C# sẽ tạo một đối tượng cho bạn.'_id' là khóa chính được yêu cầu cho một tài liệu MongoDB; bạn có thể chọn sử dụng số nhận dạng của riêng bạn hoặc sử dụng [ObjectID] mặc định (http://docs.mongodb.org/manual/reference/object-id/). – Stennie

1

_id quan trọng trong việc nhân rộng. Bạn có thể tạo bộ sưu tập không có chỉ mục _id, nhưng bạn sẽ không bao giờ có thể sao chép cơ sở dữ liệu. Nhân rộng yêu cầu chỉ mục _id trên mọi bộ sưu tập.

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