【问题标题】:Why "unique" field in creating a schema does't work?为什么创建模式中的“唯一”字段不起作用?
【发布时间】:2021-11-11 23:10:15
【问题描述】:

我有一个架构,我希望用户名字段是唯一的,但它不起作用(“必需”正常工作)。我所做的尝试:重新启动 mongodb,删除数据库。我可以知道我错过了什么吗?

这是我的架构:

import mongoose, { HookNextFunction, model } from 'mongoose';
import bcrypt from 'bcrypt';
import { AdminDocument } from '../interfaces';

const AdminSchema = new mongoose.Schema(
  {
    username: { type: String, unique: true, required: true },
    email: { type: String, unique: true, required: true },
    password: { type: String, required: true },
    role: { type: Number, enum: [0, 1], required: true },
    address: { type: String },
    phone: { type: String, required: true },
    photo: { type: String, default: null },
    name: { type: String, required: true },
    gender: { type: Number, enum: [0, 1, 2], required: true },
    refreshToken: { type: String, default: null },
  },
  { timestamps: true }
);

AdminSchema.pre('save', async function (next: HookNextFunction) {
  let user = this as AdminDocument;

  if (!user.isModified('password')) {
    return next();
  }
  const salt = await bcrypt.genSalt(Number(process.env.SALT_WORK_FACTOR));
  const hashedPassword = await bcrypt.hash(user.password, salt);

  user.password = hashedPassword;

  return next();
});

AdminSchema.methods.comparePassword = async function (
  candidatePassword: string
) {
  const user = this as AdminDocument;
  const isValid = await bcrypt.compare(candidatePassword, user.password);
  return isValid;
};

export default model<AdminDocument>('Admin', AdminSchema);

【问题讨论】:

    标签: node.js typescript mongoose


    【解决方案1】:

    在 Mongoose 连接脚本中启用这些选项 useCreateIndexautoIndex 变为 true。

    mongoose
        .connect('connection url', {
            useUnifiedTopology: true,
            useNewUrlParser: true,
            useCreateIndex: true, //make this true
            autoIndex: true, //make this also true
        })
        .then(() => {
            console.log('Connected to mongoDB');
        });
    

    然后从您的数据库中删除模式。

    【讨论】:

    • 我使用的是 mongoose v6,v6 不支持 useCreateIndex
    【解决方案2】:

    我已经通过使用 mongodb compass 创建索引解决了这个问题。但问题是我不能使用 schema.index() 方法为用户名字段创建索引,我也尝试在用户名属性中设置 index: true 和 unique: true ,两者都不起作用。这是为什么呢?

    这是我在猫鼬模式索引方法上尝试过的:

    AdminSchema.index({ username: 1 }, { unique: true });
    console.log(AdminSchema.indexes());
    

    【讨论】:

      猜你喜欢
      • 2018-02-28
      • 2015-03-03
      • 1970-01-01
      • 1970-01-01
      • 2017-05-04
      • 2021-04-13
      • 1970-01-01
      • 1970-01-01
      • 2022-01-24
      相关资源
      最近更新 更多