Javascript 如何在Mongoose中为单个文档中的多个唯一数据字段编制索引?
在我的用户文档中,我希望将Javascript 如何在Mongoose中为单个文档中的多个唯一数据字段编制索引?,javascript,mongodb,indexing,mongoose,Javascript,Mongodb,Indexing,Mongoose,在我的用户文档中,我希望将电子邮件和用户名单独索引为唯一字段,这样就不会输入重复项 问题是,我发现的所有针对多个唯一索引的文档都是针对“复合索引”的,这似乎以某种方式将第二个索引与第一个索引联系起来。我不想那样 我只想在我的注册步骤1中,如果用户提交了一封已经存在的电子邮件给MongoDB,以返回一个已经存在的错误,并且当他们设置用户名时,这与步骤2完全相同 所以我希望它们被索引,并且彼此独立。我现在正在使用它,它以某种方式将2连接在一起,这不是我想要的: const UserSchema =
电子邮件
和用户名
单独索引为唯一字段,这样就不会输入重复项
问题是,我发现的所有针对多个唯一索引的文档都是针对“复合索引”的,这似乎以某种方式将第二个索引与第一个索引联系起来。我不想那样
我只想在我的注册步骤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
});
Mongoose没有针对唯一字段的内置验证。我推荐这个包(有了它,你可以在email和username字段上使用unique validator):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.'});
将
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
}
})
有关文档,请参阅上的索引部分。无论出于何种原因,这都不起作用。不知何故,第一个字段与第二个字段相关联。当我有一个用户在注册过程中设置了一封电子邮件但还没有设置用户名时,我尝试了这个方法。任何其他试图注册并保存其电子邮件的用户都会收到mongo错误,即他们的电子邮件不是唯一的。您所做的是复合索引。我需要单独的索引。它们是单独的索引,但是如果
username
可能丢失,您还需要将该索引设置为“稀疏”。向字段定义中添加sparse:true
,以允许多个“null”。请注意,您需要先手动删除该索引,因为mongoose不会替换现有索引。有关类似问题,请参阅。因此,我实际上已经实现了这个mysef。在保存任何用户名或电子邮件之前,我会“找到”该电子邮件或用户名,如果没有出现任何问题,我会允许它继续。这很好地工作,除了边缘的情况下,其中两个相同的电子邮件保存在同一时间,因为我的检查是异步的,他们都可以保存。这个问题在您的软件包解决方案中仍然存在。我所需要的是一种方法,让mongo唯一地索引这两个字段,使它们彼此独立,这样mongo就永远不会保存它,如果它已经存在的话,从而修复我的边缘情况。