Nodejs中mongodb如何不区分大小写查找?

Nodejs中mongodb如何不区分大小写查找?

如两个相同的用户名CNODE和cnode 前者已注册,将要注册后者 在node中

User.findOne({username: {$regex: username, $options: "i"}}, {username: 1, email: 1, create: 1, head: 1}, function (err, user) {
        callback(err, user);
});

但是这么写的话cn和cno还有cnod都会算作已注册过,如何写才可以?


6 回复

Node.js 中 MongoDB 如何不区分大小写查找?

在 Node.js 中使用 MongoDB 进行查询时,有时需要进行不区分大小写的匹配。例如,你可能希望在用户注册时检查用户名是否已经存在,但不希望因为大小写不同而拒绝注册请求。

示例代码

假设我们有一个名为 User 的集合,并且我们想要检查一个用户名是否已经存在(不区分大小写)。我们可以使用 $regex 操作符来实现这一点。

const mongoose = require('mongoose');
const User = mongoose.model('User', new mongoose.Schema({ 
    username: String,
    email: String,
    create: Date,
    head: String
}));

function checkUsername(username, callback) {
    User.findOne({
        username: {
            $regex: '^' + username + '$',
            $options: 'i'
        }
    }, {
        username: 1,
        email: 1,
        create: 1,
        head: 1
    }, function (err, user) {
        if (err) return callback(err);
        callback(null, user);
    });
}

// 使用示例
checkUsername('cnode', function(err, user) {
    if (err) {
        console.error('Error:', err);
    } else if (user) {
        console.log('Username already exists:', user.username);
    } else {
        console.log('Username is available.');
    }
});

解释

  1. $regex 操作符

    • $regex 用于执行正则表达式匹配。
    • 在这个例子中,我们使用了 '^' + username + '$' 来确保整个字符串必须完全匹配输入的用户名。
  2. $options: 'i'

    • $options 参数允许我们指定正则表达式的选项。
    • 'i' 表示忽略大小写。
  3. 正则表达式

    • '^' + username + '$' 确保只有完全匹配的字符串才会被认为是已存在的用户名。
      • '^' 表示字符串的开始。
      • '$' 表示字符串的结束。
      • 这样可以避免部分匹配的情况,例如 cncnocnod

通过这种方式,你可以确保只有完全匹配的用户名会被认为是已存在的,而不区分大小写。


存的時候冗余一個已經轉換為小寫的字段做查詢用,在寫少查多的的情況下很有用。

非常感谢,一时没想起来,感谢你的方法!

$regex: ‘^’ + username + ‘$’ 也可以吧?不过实时生成 regex 很容易被用户调戏

我查了查,好像只能用正则来做了。不懂效率会不会慢。

为了在 Node.js 中使用 MongoDB 进行不区分大小写的查询,并且确保只有完全匹配的用户名才会被认定为已注册,你可以使用正则表达式来实现。下面提供了一个具体的示例代码,演示如何在 MongoDB 中进行精确且不区分大小写的查询。

示例代码

假设你有一个用户模型 User,并且你想检查一个特定的用户名(例如 cnode)是否已经存在数据库中。

const mongoose = require('mongoose');
const User = mongoose.model('User', new mongoose.Schema({
    username: String,
    email: String,
    create: Date,
    head: String
}));

function checkUsernameExists(username, callback) {
    const query = {
        username: {
            $regex: '^' + username.toLowerCase() + '$',
            $options: 'i'
        }
    };

    User.findOne(query, (err, user) => {
        if (err) return callback(err);
        callback(null, user ? true : false); // 返回是否存在该用户名
    });
}

// 使用函数
checkUsernameExists('cnode', (err, exists) => {
    if (err) console.error(err);
    else console.log(`Username exists: ${exists}`);
});

解释

  • 正则表达式$regex 的值包含正则表达式,使用 ^$ 分别表示字符串的开始和结束,以确保整个字符串必须与提供的用户名完全匹配。
  • 大小写不敏感$options: 'i' 表示正则表达式是大小写不敏感的。
  • query 构造:构造查询对象时,将输入的 username 转换为小写,确保查询也是不区分大小写的。
  • findOne 方法:使用 User.findOne 方法查询单个文档。如果找到匹配项,则返回 true;否则返回 false

通过这种方式,可以确保查询只匹配完全相同(但不区分大小写)的用户名。

回到顶部