我有以下架构:
在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();
});
答案 0 :(得分: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}]
});
或强>
var Discussion = new schema({
'topic': {type: String},
'description': {type: String},
'datetime': {type: Date},
'status': String,
'user': [{type: Schema.ObjectId, ref: 'user'}]
});