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]
});

データベースに既に存在するユーザーとの新しいディスカッションを保存すると、「ユーザー名は既に使用されています」というエラー メッセージが表示されます。新しいユーザーには一意の名前が必要ですが、新しいディスカッションには既存のユーザーが必要です。どうすればこの問題を克服できますか?

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

1 に答える 1

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'}]
});
于 2012-10-03T12:32:13.963 に答える