mongoose:唯一字段不起作用

6

我正在尝试找出如何强制执行不是索引的字段上的唯一性。

我在这里看到了类似的问题,但是使用 dropDups: true 的答案被提到已经过时。

强制对一个字段进行唯一性约束的正确方法是什么?

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

我认为你的代码完美无缺,我会使用它。你在使用索引时遇到了问题吗? - JosephM
我刚在mongoose API中发现: 初学者常见的陷阱是,模式的唯一选项不是验证器。它是一个方便的助手,用于构建MongoDB唯一索引。 所以我猜想,对于我想要唯一的非索引字段,我需要手动编写验证。 - Yoni Mayer
1
@YoniMayer 如果不使用索引,你如何可靠地检查一个值是否唯一? - robertklep
2个回答

7
使用此mongoose-unique-validator来提高it技术的效率。

var mongoose = require('mongoose');
var uniqueValidator = require('mongoose-unique-validator');
 
// Define your schema as normal.
var userSchema = mongoose.Schema({
    username: { type: String, required: true, unique: true },
    email: { type: String, index: true, unique: true, required: true },
    password: { type: String, required: true }
});
 
// Apply the uniqueValidator plugin to userSchema.
userSchema.plugin(uniqueValidator);


2
解决了我的问题。为什么我们需要另一个第三方软件包来解决这个问题? - HaulinOats

0

如果你这样做,它将无法用于唯一键验证。

var userSchema = new Schema({
    name : String,
    username : {
        type : String,
        required : true,
        index : {
            unique : true,
            dropDups : true
        }
    });

所以你现在正在以正确和最佳的方式进行操作,就像这样做

使用以下命令从数据库中删除集合

> db.<collection name>.drop()

然后重新启动服务器,通过以下方式进行检查。

var userSchema = new Schema({
    name : String,
    username : {
        type : String,
        required : true,
        unique : true
    });

谢谢JosephM,但是我的目标是在非索引字段上实现独一无二。 - Yoni Mayer
这里的用户名不是索引,你可以通过db.<collection>.getIndexes()来检查索引字段。 - JosephM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接