【问题标题】:Unique Fields in Mongoose猫鼬中的独特领域
【发布时间】:2017-02-09 10:30:46
【问题描述】:

我正在尝试在现有数据库中的猫鼬模型上按字段强制执行唯一性。

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

然后,当我使用已分配的电子邮件创建用户时,它通过了,并且我有 2 个用户使用相同的电子邮件。

我已阅读所有相关的 SO 答案 > 2015 以及所有关于 dropDupswhich is deprecated 的内容。

我想我通过手动运行解决了这个问题

db.users.createIndex({email:1}, {unique:true})

然而,这在开发和生产中显然变得很麻烦,尤其是考虑到属性负责处理它的mongoose docs 状态:

unique: boolean,是否在该属性上定义唯一索引。

考虑到现有数据库和新集合,有人可以提供一个明确的解决方案来在 Mongoose 模型上按字段强制执行唯一性吗?谢谢

【问题讨论】:

  • @JohnnyHK 这怎么可能是骗局?您是否建议每次要添加具有唯一字段的集合时都必须手动调用 db.collection.dropIndex('fieldName_1') ?根本不回答我的问题
  • 经常发生的情况是您没有意识到该集合已经在该字段上具有(非唯一)索引,因此 Mongoose 不会添加您定义的唯一索引。 db.users.getIndexes() 显示什么?
  • 我删除了集合以重新开始并创建了一个新用户。 db.users.getIndexes() 现在显示 [ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "testdb.users" } ] @JohnnyHK
  • 您的环境中可能禁用了autoIndex。尝试通过添加对 UserSchema.set('autoIndex', true); 的调用来启用它,然后再试一次。

标签: javascript node.js mongodb mongoose mongoose-schema


【解决方案1】:

在创建唯一索引之前已经创建了两个用户。因此您可以插入两个具有相同电子邮件的用户。您可以尝试下面的代码,它确保所有索引都已创建:

UserModel.on('index', function(error) {
  const user1 = new UserModel({
    email: '3489'
  });

  const user2 = new UserModel({
    email: '3489'
  });
  user1.save(console.log);
  user2 .save(console.log);
});

【讨论】:

    猜你喜欢
    • 2014-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-22
    • 1970-01-01
    • 2018-09-30
    • 1970-01-01
    相关资源
    最近更新 更多