【问题标题】:Make a field unique in one schema but not unique in other schemas with MongoDB/Mongoose使用 MongoDB/Mongoose 使一个字段在一个模式中唯一,但在其他模式中不唯一
【发布时间】:2019-11-06 13:45:14
【问题描述】:

我正在使用 mongoDB 和 Mongoose 来构建 API。

我有两个(可能更快)架构:

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

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

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

每个用户现在只能写一张票,如果我尝试第二张票,我会遇到这个错误:

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

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

该索引也只存在于门票集合,而不是用户集合? 该索引从何而来?

我的问题是:是否可以让电子邮件字段在用户架构中保持唯一,但在其他架构中不唯一?

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

谢谢!

【问题讨论】:

  • 是的,您可以在用户集合中唯一的电子邮件,但不能在其他集合中使用
  • @NuOne 但是 author.email 上的索引来自哪里?

标签: node.js mongodb mongoose


【解决方案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'})

【讨论】:

  • 我试过了,我得到了这个错误:E11000 重复密钥错误集合:BTB_DB.tickets 索引:author.email_1 复制密钥:{:null} 编辑:我删除了集合,用票重新创建了它创建时,它再次创建了索引,但它现在正在工作。谢谢!
猜你喜欢
  • 2022-01-24
  • 1970-01-01
  • 2021-09-05
  • 2020-06-28
  • 2018-04-14
  • 2021-09-09
  • 2016-03-09
  • 2012-12-09
  • 1970-01-01
相关资源
最近更新 更多