【问题标题】:Unique key in embedded document嵌入文档中的唯一键
【发布时间】:2012-10-03 20:32:13
【问题描述】:

我有以下架构:

在 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();
});

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    不要将整个UserSchema 对象嵌入到讨论中,只需将您需要的关于用户的内容嵌入到讨论的上下文中,甚至只是用户的_id,这样您就可以根据需要使用@ 访问用户的属性987654321@。不要复制超出您需​​要的数据。

    例如:

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-20
    • 1970-01-01
    • 2013-05-17
    • 2016-04-03
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    相关资源
    最近更新 更多