2012-10-03 30 views
0

我有以下模式:唯一键

在user.js的

var User = new schema({ 
    'name': {type: String}, 
    'email': {type: String}, 
    'gender': {type: String}, 
    'password': String, 
    'salt': String, 
}); 

//ensure name is unique 
//The reason why I did not use index:{unique:true} is because it return 
//ugly error message (err: 'E11000 duplicate key error index: test.users.$name_1 
//dup key: { : "test1" }') 
User.path('name').validate(function(name, respond){ 
    var UserModel = mongoose.model("User"); 
    UserModel.findOne({name: name}, function(e, user){ 
    if(user) respond(false); 
    else respond(true); 
    }); 
}, 'Username Already in Use'); 

在Discussion.js

var Discussion = new schema({ 
    'topic': {type: String}, 
    'description': {type: String}, 
    'datetime': {type: Date}, 
    'status': String, 
    'user': [UserSchema] 
}); 

当我保存用户的新的讨论已经存在于db中,我得到一个“用户名已被使用”的错误信息。新用户应该有一个唯一的名称,而新的讨论应该有一个现有的用户。我怎样才能克服这个问题?

User.findOne({name: name}, function(err, user){ 
    var discussion = new Discussion(); 
    discussion.user.push(user); 
    discussion.save(); 
}); 

回答

1

不嵌入整个UserSchema对象纳入讨论,只是嵌入您需要了解的讨论,甚至只是用户的_id这样你就可以访问用户的属性的情况下,用户有什么作为使用populate需要。不要复制比您需要的数据更多的数据。

例如:

var Discussion = new schema({ 
    'topic': {type: String}, 
    'description': {type: String}, 
    'datetime': {type: Date}, 
    'status': String, 
    'user': [{_id: Schema.ObjectId, name: String}] 
}); 

OR

var Discussion = new schema({ 
    'topic': {type: String}, 
    'description': {type: String}, 
    'datetime': {type: Date}, 
    'status': String, 
    'user': [{type: Schema.ObjectId, ref: 'user'}] 
}); 
+0

的感谢!现在正在工作。 –

+0

第二个例子似乎是官方的方法:http://mongoosejs.com/docs/populate.html – wtjones