mongo 正在使用键/值 null 自动创建索引

Posted

技术标签:

【中文标题】mongo 正在使用键/值 null 自动创建索引【英文标题】:mongo is creating index with key / value null automatically 【发布时间】:2021-05-02 13:09:43 【问题描述】:

当我在这条路线上创建一个新用户(使用猫鼬)时,它就被创建了。我在控制台中看到了验证,我也可以在 mongo 数据库中看到用户。但是当我尝试创建第二个用户(使用不同的用户名)时,我收到了这个错误:

(node:16480) UnhandledPromiseRejectionWarning: MongoError: E11000 duplicate key error collection: .users index: userName_1 dup key: userName: null

    索引userName_1从何而来? 密钥 userName 是从哪里来的? 为什么这个值是 null? 我该如何摆脱它
router.post('/register', (req, res) => 
    User.findOne(username: req.body.username, async (err, user) => 
        if (err) throw err
        if (user) res.json('User already exists')
        if (!user) 
            const hashPassword = await bcrtypt.hash(req.body.password, 10)
            const newUser = new User(
                username: req.body.username,
                password: hashPassword,
            )
            await newUser.save()
            res.json('User created!')
            console.log(newUser)
        
    )
)

这是架构:

const userSchema = new Schema(
    username: 
        type: String,
        required: true,
        unique: true,
        lowercase: true,
    ,
    password: 
        type: String,
        required: true,
    
, 
    timestamps: true,
)

【问题讨论】:

【参考方案1】:

来自您的架构:

username: 
    type: String,
    required: true,
    unique: true,
    lowercase: true,

    

Mongoose 会自动创建一个索引来强制执行unique。这是正确的,因为它不必在插入之前进行查找来强制它,所以它更快。

仔细检查username 字段是否确实如您所期望的那样保存在数据库中。 required: true 应该可以解决这个问题,但错误消息显示您以某种方式拥有 null 用户名。

另外 - 因为您使用的是 lowercase,所以您的 findOne 可能不适合确定用户是否已经存在。 IE。如果我创建一个用户“adam”,然后尝试创建一个用户“Adam”,这将导致错误,因为“Adam”的查找将一无所获,但架构随后会将值小写以将其保存为“adam” ,并且索引将失败。

【讨论】:

以上是关于mongo 正在使用键/值 null 自动创建索引的主要内容,如果未能解决你的问题,请参考以下文章

mongo索引

MongoDb在并非所有文档中的字段上创建唯一索引[重复]

无法获取属性,因为在 null 或 undefined [1] 中缺少声明预期键/值类型的索引签名

10约束

mongo 自动创建索引导致应用连接超时

postgresql----唯一索引,表达式索引,部分索引