2013-06-15 47 views
7

Tôi đã tạo chỉ mục thưa thớt và duy nhất trên bộ sưu tập mongodb của mình.Mongodb chỉ số thưa thớt độc đáo

var Account = new Schema({ 
       email: { type: String, index: {unique: true, sparse: true} }, 
         .... 

Nó đã được tạo ra một cách chính xác:

{ "ns" : "MyDB.accounts", "key" : { "email" : 1 }, "name" : "email_1", "unique" : true, "sparse" : true, "background" : true, "safe" : null } 

Nhưng nếu tôi chèn một tài liệu thứ hai với một phím không thiết lập tôi nhận được lỗi này:

{ [MongoError: E11000 duplicate key error index: MyDB.accounts.$email_1 dup key: { : null }] 
    name: 'MongoError', 
    err: 'E11000 duplicate key error index: MyDB.accounts.$email_1 dup key: { : null }', 
    code: 11000, 
    n: 0, 
    ok: 1 } 

Bất kỳ gợi ý?

+0

bạn có thể kiểm tra trong bộ sưu tập không, nếu có bất kỳ tài liệu nào có 'null' cho trường email. Nó có thể xảy ra rằng các công cụ mẫu mà bạn đang sử dụng là chèn giá trị null cho trường đó. Tôi kiểm tra tại địa phương, nó hoạt động tốt. –

+0

Bằng cách đặt 'email' thành' unique', nó bắt buộc phải là duy nhất cho mọi tài liệu trong bộ sưu tập. Chỉ có một giá trị 'null' chẳng hạn. Vì vậy, điều này có vẻ như nó hoạt động như mong đợi. – WiredPrairie

+0

Chỉ cần trả lời câu hỏi này: http://stackoverflow.com/questions/17114851/mongo-id-field-duplicate-key-error/17115770#17115770 - nó rất giống nhau (và có khả năng giống nhau) vấn đề. – WiredPrairie

Trả lời

10

Tôi cũng gặp sự cố này. Tôi muốn một giá trị hoặc là null hoặc là duy nhất. Vì vậy, tôi đặt cả uniquesparse cờ:

var UserSchema = new Schema({ 
    // ... 
    email: {type: String, default: null, trim: true, unique: true, sparse: true}, 
    // ... 
}); 

Và, tôi chắc chắn rằng cơ sở dữ liệu đã thực sự tạo ra các chỉ số một cách chính xác với db.users.getIndexes();

{ 
    "v" : 1, 
    "key" : { 
    "email" : 1 
    }, 
    "unique" : true, 
    "ns" : "test.users", 
    "name" : "email_1", 
    "sparse" : true, 
    "background" : true, 
    "safe" : null 
}, 

(Vì vậy, đây là không giống như vấn đề ở đây: mongo _id field duplicate key error)

Lỗi của tôi là đặt giá trị default thành null. Trong một số ý nghĩa, Mongoose đếm một số null rõ ràng là một giá trị phải là duy nhất. Nếu trường không bao giờ được xác định (hoặc undefined) thì trường đó không được bắt buộc phải là duy nhất.

email: {type: String, trim: true, unique: true, sparse: true}, 

Vì vậy, nếu bạn đang gặp vấn đề này quá, chắc chắn rằng bạn không thiết lập các giá trị mặc định, và chắc chắn rằng bạn không thiết lập các giá trị để null bất cứ nơi nào khác trong mã của bạn, hoặc. Thay vào đó, nếu bạn cần đặt nó một cách rõ ràng, hãy đặt nó thành undefined (hoặc một giá trị duy nhất).