18

我有一个userSchema这样的:

var userSchema = new Schema({
    name: {
      type: String
    , required: true
    , validate: [validators.notEmpty, 'Name is empty']
    }
  , username: {
      type: String
    , required: true
    , unique: true
    , validate: [validators.notEmpty, 'Username is empty']
    }
});

username字段应该是唯一的。如果数据库中已经存在此用户名,Mongoose 将抛出错误。但是,它不区分大小写,我需要它。

我是否认为实现不区分大小写的唯一检查的唯一方法是编写我自己的验证规则,该规则将对集合执行查询?是否可以编写这样的验证检查,创建更多与集合的连接?我也需要为 做类似的事情email

4

9 回答 9

18

如何使用:

{ type: String, lowercase: true, trim: true }

达到你的目的?

于 2012-12-21T14:13:04.900 回答
11

索引上的排序规则strength: 2解决了这个问题。

index: {
  unique: true,
  collation: {
    locale: 'en',
    strength: 2
  }
}

将其放在您的模式创建代码中,如下所示:

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

注意:确保模型上的索引得到更新——您可能需要手动执行此操作。

于 2019-02-07T16:19:51.857 回答
6

...在NodeJS上使用猫鼬进行查询:

const countryName = req.params.country;

{ 'country': new RegExp(`^${countryName}$`, 'i') };

或者

const countryName = req.params.country;

{ 'country': { $regex: new RegExp(`^${countryName}$`), $options: 'i' } };

// ^australia$

或者

const countryName = req.params.country;

{ 'country': { $regex: new RegExp(`^${countryName}$`, 'i') } };

// ^turkey$

一个完整的 Javascript 代码示例,NodeJS 和 Mongoose ORM on MongoDB

// get all customers that given country name
app.get('/customers/country/:countryName', (req, res) => {
    //res.send(`Got a GET request at /customer/country/${req.params.countryName}`);

    const countryName = req.params.countryName;

    // using Regular Expression (case intensitive and equal): ^australia$

    // const query = { 'country': new RegExp(`^${countryName}$`, 'i') };
    // const query = { 'country': { $regex: new RegExp(`^${countryName}$`, 'i') } };
    const query = { 'country': { $regex: new RegExp(`^${countryName}$`), $options: 'i' } };

    Customer.find(query).sort({ name: 'asc' })
        .then(customers => {
            res.json(customers);
        })
        .catch(error => {
            // error..
            res.send(error.message);
        });
});
于 2020-02-03T05:44:00.957 回答
2

我不知道你是否在 node.js 中这样做。但是您可以使用这样的 npm:https ://github.com/blakehaswell/mongoose-unique-validator来检查集合字段的唯一验证。其他方式可能是每次有新请求到来时检查集合。 http://timstermatic.github.io/blog/2013/08/06/async-unique-validation-with-expressjs-and-mongoose/ 您可以参考此处的材料并以适合您情况的方式使用它。

于 2016-03-03T19:08:14.290 回答
1

我使用猫鼬唯一验证器

例子 :

const mongoose = require('mongoose');
const uniqueValidator = require('mongoose-unique-validator');
const { Schema } = mongoose;

const UserSchema = new Schema({
  name: {
    type: String,
    required: true,
    unique: true,
    index: true,
    maxlength: 100,
    trim: true,
    uniqueCaseInsensitive: true
  },
  username: {
    type: String,
    required: true,
    unique: true,
    index: true,
    maxlength: 100,
    trim: true,
    uniqueCaseInsensitive: true
  }
});

UserSchema.plugin(uniqueValidator, {
  message: 'Error, expected {PATH} to be unique.'
});

module.exports = mongoose.model('User', UserSchema);

于 2019-01-14T15:45:50.983 回答
1

最好的方法是使用下面共享的现有 npm 包。 https://www.npmjs.com/package/mongoose-unique-validator

要使其区分大小写,您可以在同一页面中关注uniqueCaseInsensitive 。

当已经有可用的包时,无需编写自己的验证逻辑(也可以关注Avinash 的帖子)。

于 2016-10-28T10:51:04.473 回答
0

我在做一个项目时遇到了同样的问题。我只是用两行代码让它变得简单。将所有传入值转换为小写字母。

let getUsername = req.body.username;
let username = getUsername.toLowerCase();
于 2019-08-08T10:51:29.627 回答
0

非常简单的解决方案

username : {
        trim:true,
        //lowercase:true,

        type:String,
        required:[true, '{PATH} is required.'],
        match : [
            new RegExp('^[a-z0-9_.-]+$', 'i'),
            '{PATH} \'{VALUE}\' is not valid. Use only letters, numbers, underscore or dot.'
        ],
        minlength:5,
        maxlength:30,
        //unique:true

        validate : [
            function(un, cb){
                console.log(v);
                student.findOne({username:/^un$/i}, function(err, doc){
                    if(err) return console.log(err);
                    if(!_.isEmpty(doc)) return cb(false);
                    return cb(true);
                });
            },
            'Username already exists.'
        ]
    },

student在这里,如果存在相同的字段,我正在使用异步验证并检查我的模型。如果需要,使用显然可以使用正则表达式。

但我不推荐这种方法,它不适合我的头脑。

而是坚持使用{ type: String, lowercase: true, trim: true, unique:true }方法并将原始用户名复制到其他字段以防万一。

于 2016-07-10T11:15:27.437 回答
-2

使用正则表达式怎么样?

var pattern = [ /some pattern/, "{VALUE} is not a valid user name!" ];

{ type: String, match: pattern }

如需进一步参考: http: //mongoosejs.com/docs/api.html#schematype_SchemaType-required

于 2015-02-10T09:08:53.930 回答