如何在Mongoose中的单个文档中索引多个唯一数据字段?

时间:2018-07-04 18:11:41

标签: javascript mongodb indexing mongoose

在用户文档中,我想分别将emailusername索引为唯一字段,以便永远不会输入重复项。

问题在于,我为多个唯一索引找到的所有文档都是针对“复合索引”的,它似乎以某种方式将第二个索引与第一个索引绑定在一起。我不要

如果用户提交的邮件对MongoDB来说已经存在,并且返回与第2步完全相同的电子邮件,则我想在注册第1步中进行操作< / strong>,当他们设置用户名时。

所以我希望它们的索引和唯一性彼此分开。我现在正在使用它,它以某种方式将2绑在一起,这不是我想要的:

const UserSchema = new mongoose.Schema({
  email: {
    type: String,
    required: true,
    trim: true
  },
  username: {
    type: String,
    required: false,
    trim: true
  }
})

UserSchema.index({
  email: 1,
  username: 1
}, {
  unique: true
});

2 个答案:

答案 0 :(得分:1)

猫鼬没有针对唯一字段的内置验证。我推荐该软件包(与此配套的是,您可以在电子邮件和用户名字段上使用唯一验证器):mongoose-unique-validator。使用以下代码扩展代码:

let uniqueValidator = require('mongoose-unique-validator');

email: {
  type: String,
  required: true,
  trim: true,
  unique: true,
  index: true
},
  username: {
  type: String,
  required: false,
  trim: true,
  unique: true,
  index: true
}

UserSchema.plugin(uniqueValidator, {message: 'is already taken.'});

答案 1 :(得分:0)

在架构中的每个字段定义中添加unique: true,以为这些字段创建单独的唯一索引:

const UserSchema = new mongoose.Schema({
  email: {
    type: String,
    required: true,
    trim: true,
    unique: true
  },
    username: {
    type: String,
    required: false,
    trim: true,
    unique: true
  }
})

有关文档,请参见this page上的索引部分。