首页 > 解决方案 > 如何在 Mongoose 的单个文档中索引多个唯一数据字段?

问题描述

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

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

我想要的只是在我的注册步骤 1中,如果用户提交了一封已经存在的电子邮件,以便 MongoDB 返回一个它已经存在的错误,并且与步骤 2完全相同 ,当他们设置他们的用户名时。

所以我希望它们被索引并且彼此独立。我现在正在使用它,它以某种方式将 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
});

标签: javascriptmongodbindexingmongoose

解决方案


Mongoose 没有对唯一字段的内置验证。我推荐这个包(你可以在电子邮件和用户名字段上使用唯一验证器):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.'});

推荐阅读