2012-04-27 33 views
19

Với sơ đồ sau:Mongoose: cách đặt trường lược đồ là ID?

var UserSchema = new Schema({ 
    , email : { type: String } 
    , passwordHash : { type: String } 
    , roles : { type: [String] } 
}); 

Tôi muốn email là chìa khóa. Tôi làm cách nào để xác định điều này?

tôi có thể làm:

var UserSchema = new Schema({ 
     , _id: { type: String } 
     , passwordHash : { type: String } 
     , roles : { type: [String] } 
    }); 

nên MongoDB sẽ nhận ra nó như là id-lĩnh vực, và thích ứng với mã của tôi để tham khảo _id thay vì email nhưng điều đó không cảm thấy sạch sẽ cho tôi.

Bất kỳ ai?

+7

Tôi nghĩ bạn nên rời khỏi _id như một ObjectId và làm email một chỉ số duy nhất. – JohnnyHK

+0

Đó có phải là sự đồng thuận chung không? Có tên miền-id là duy nhất và để MongoDB quản lý các Id kỹ thuật? –

+0

Vì bạn đang sử dụng Mongoose, một tùy chọn khác sẽ là sử dụng chuỗi email làm trường _id và sau đó thêm [trường ảo] (http://mongoosejs.com/docs/virtuals.html) có tên là "email" được trả về _id để dọn sạch mã sử dụng email. – JohnnyHK

Trả lời

32

Vì bạn đang sử dụng Mongoose, một lựa chọn là sử dụng chuỗi email như lĩnh vực _id và sau đó thêm một virtual field tên email mà trả về _id để làm sạch các mã có sử dụng email.

var userSchema = new Schema({ 
    _id: {type: String}, 
    passwordHash: {type: String}, 
    roles: {type: [String]} 
}); 

userSchema.virtual('email').get(function() { 
    return this._id; 
}); 

var User = mongoose.model('User', userSchema); 

User.findOne(function(err, doc) { 
    console.log(doc.email); 
}); 

Lưu ý rằng một lĩnh vực ảo không được bao gồm theo mặc định khi chuyển đổi một doc Mongoose đến một đối tượng JS đồng bằng hoặc JSON chuỗi. Để đưa nó, bạn phải thiết lập các tùy chọn trong virtuals: truetoObject() hoặc toJSON() gọi:

var obj = doc.toObject({ virtuals: true }); 
var json = doc.toJSON({ virtuals: true }); 
+1

Bạn có thể vui lòng cho biết mã op sẽ trông như thế nào khi sử dụng giải pháp của bạn không? –

+1

@ZackS Ý tưởng hay - được thêm vào. – JohnnyHK

+0

Để làm cho câu trả lời hoàn chỉnh hơn, tôi đã thêm nhiều chi tiết hơn về các trường ảo - dường như là câu hỏi phổ biến. –

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