使用MongoDB / Mongoose使字段在一个模式中唯一,但在其他模式中不唯一

时间:2019-06-24 18:10:17

标签: node.js mongodb mongoose

我正在将mongoDB与Mongoose一起使用来构建API。

我有两个(也许很快)模式:

user : {
    name : String,
    email : {
        required: true,
        unique : true
    }
}

ticket : {
     title : String,
     author : userModel.schema,
}

每个用户都必须具有唯一的电子邮件,因为他们会将其用作登录凭据。 每个用户都可以编写票证,每次发送票证时,我都在author字段中添加编写票证的用户对象。

到目前为止,每个用户只能写一张票,如果我尝试第二张票,则会出现此错误:

E11000 duplicate key error collection: BTB_DB.tickets index: author.email_1 dup key: { : "email@email.com"}

我发现Mongo实际上为票证创建了一个索引,以确保author.email唯一,请参见下面的mongo指南针屏幕截图:

mongocompass

该索引也只显示在票证集合中,而不显示在用户集合中? 该索引来自哪里?

我的问题是:是否可以在用户模式中保持电子邮件字段的唯一性,而在其他模式中保持唯一性?

如果没有其他方法可以将用户嵌套在票证中?我只尝试了一点userId和mongoose的填充方法,是否应该在该解决方案上投入更多时间?我真的很想让用户参与其中。

谢谢!

1 个答案:

答案 0 :(得分:1)

在故障单中定义作者

ticket : {
     title : String,
     author : {
      type: mongoose.Schema.Types.ObjectId,
      ref: 'User'
    },
}

在获取票证时,如果要让票证所属的用户使用populate()这样,

Ticket.find().populate('author');

以及创建票证时,请确保在“作者”字段中提供用户的_id

new Ticket({'title': 'title of the ticket', 'author':'_idOfTheUser'})