Mongoose不区分大小写的模式

时间:2018-05-13 20:11:16

标签: node.js mongoose

我正在尝试使模式中的所有查找调用都不区分大小写。这是我到目前为止所得到的:

const user = new new mongoose.Schema({
        username: {
            trim: true,
            required: true,
            type: String,
            match : [
                new RegExp('^[a-z0-9_.-]+$', 'i'),
                '{PATH} \'{VALUE}\' invalid'
            ],
            validate : [
                (username, callback) => {
                    console.log(username);

                    user.findOne({ username: new RegExp(`/^${username}$/i`) }, (err, doc) => {
                        if(!doc) return callback(false);
                        return callback(true);
                    });
                },
                'Username already exists'
            ]
        });

我做错了什么?

2 个答案:

答案 0 :(得分:1)

我设法让这个工作通过中间件:

user.pre('find', function() {
    if (this._conditions.username) {
        this._conditions.username = new RegExp(this._conditions.username.replace(/\./g, '\\\\.'), 'i');
    }
});

答案 1 :(得分:0)

您可以通过在创建mongoose.Schema的新实例时定义mongoDb称为排序规则https://docs.mongodb.com/manual/core/index-case-insensitive/的方式来使模式不敏感。

var someSchema = new mongoose.Schema({
   username: {type: String, required: true}
}, {
   collation: { locale: 'en', strength: 2 }
});

现在,您已在模式级别应用了不区分大小写的逻辑,该逻辑将在查询该模式的模型时反映并使用。

someModel.findOne({username: 'UsERName1'})

由于您在模型对应的模式上进行排序,因此上述查询现在变为不区分大小写。