Nodejs mongoose 正则匹配

Nodejs mongoose 正则匹配

var regex = new RegExp(sSearch, ‘i’); User.find({name: regex}).exec(function (err, items){ } name 的type是String, 这样是可以的;如果换成age,age的type是Number,就报类型转换错误 CastError: Cast to number failed for value “/(?:)/i” at path “age”, 请问一下,该是怎么样的写法?


8 回复

当然可以!在使用 Mongoose 进行正则匹配时,我们通常会对字符串类型的字段进行匹配。如果你尝试对数字类型的字段(如 age)使用正则表达式,Mongoose 会抛出类型转换错误,因为数字类型的字段期望的是数值而不是字符串。

假设你有一个 User 模型,并且你想根据 name 字段进行正则匹配,同时你也想根据 age 字段进行一些过滤操作。你可以这样做:

示例代码

const mongoose = require('mongoose');
const { Schema } = mongoose;

// 定义用户模型
const userSchema = new Schema({
  name: String,
  age: Number
});

const User = mongoose.model('User', userSchema);

// 假设 sSearch 是一个搜索字符串,例如 "John"
const sSearch = "John";

// 创建正则表达式对象
const nameRegex = new RegExp(sSearch, 'i');

// 查询条件
const query = {
  name: nameRegex,
  age: { $gt: 18 } // 假设你想查询年龄大于18岁的用户
};

// 执行查询
User.find(query, function(err, items) {
  if (err) {
    console.error(err);
    return;
  }
  
  console.log(items);
});

解释

  1. 定义模型:我们首先定义了一个包含 nameage 字段的 User 模型。
  2. 创建正则表达式:我们创建了一个正则表达式对象 nameRegex,用于匹配 name 字段。
  3. 查询条件:我们构建了一个查询对象 query,其中包含了两个条件:
    • name 字段使用正则表达式进行匹配。
    • age 字段使用 $gt 操作符进行比较,确保只返回年龄大于18岁的用户。
  4. 执行查询:最后,我们使用 User.find(query) 方法执行查询,并传入回调函数处理结果。

这样,即使你在查询中同时使用了正则表达式和数字类型的条件,也不会出现类型转换错误。


你这个正则里面是什么东西来的啊。代码补全啊,要是数字也是[0-9]匹配

Number为什么要用正则匹配啊-.-

i参数是什么玩意?http://tool.oschina.net/regex# 在线正则

并行的查吧, name 用 regex 去匹配, age 用 Number(sSearch) 去查,然后聚合一下。

可以这么写 var uname = “frank”; Users.find({name:eval(’/’+uname+’/’)})

挖坟~ 后来怎么解决的

在使用 Mongoose 进行正则匹配时,如果你想要对字符串类型的字段进行匹配是没有问题的。但是,如果你尝试对数字类型的字段进行正则匹配,Mongoose 会抛出一个 CastError,因为数字类型的字段不能直接与正则表达式匹配。

解决方案

  1. 只对字符串类型的字段进行正则匹配:这是最常见的用法。
  2. 对于数字类型的字段,你需要改变查询逻辑:例如,你可以先筛选出符合条件的文档,然后在应用程序层面进行进一步处理。

示例代码

假设我们有一个用户模型,其中包含 name 字段(字符串类型)和 age 字段(数字类型)。我们希望根据名字中是否包含某个关键词进行筛选,并且不希望对年龄字段使用正则表达式。

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

// 用户模型
const UserSchema = new Schema({
    name: { type: String },
    age: { type: Number }
});

const User = mongoose.model('User', UserSchema);

async function findUsers(sSearch) {
    try {
        // 创建正则表达式
        const regex = new RegExp(sSearch, 'i');

        // 查找名字中包含关键词的用户
        const users = await User.find({ name: regex }).exec();

        // 输出结果
        console.log(users);
    } catch (error) {
        console.error(error);
    }
}

// 测试
findUsers('John');

解释

  • 正则表达式:我们创建了一个正则表达式 regex,并将其用于查找名字中包含关键词的用户。
  • 查找操作:我们使用 User.find({ name: regex }) 来查找名字字段中包含关键词的用户记录。
  • 避免类型错误:我们没有尝试对 age 字段使用正则表达式,因为我们知道这会导致类型转换错误。

如果你确实需要对数字字段进行某种形式的匹配,那么你应该在应用程序层面实现这种逻辑,而不是在数据库查询中使用正则表达式。

回到顶部