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”, 请问一下,该是怎么样的写法?
当然可以!在使用 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);
});
解释
- 定义模型:我们首先定义了一个包含
name
和age
字段的User
模型。 - 创建正则表达式:我们创建了一个正则表达式对象
nameRegex
,用于匹配name
字段。 - 查询条件:我们构建了一个查询对象
query
,其中包含了两个条件:name
字段使用正则表达式进行匹配。age
字段使用$gt
操作符进行比较,确保只返回年龄大于18岁的用户。
- 执行查询:最后,我们使用
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
,因为数字类型的字段不能直接与正则表达式匹配。
解决方案
- 只对字符串类型的字段进行正则匹配:这是最常见的用法。
- 对于数字类型的字段,你需要改变查询逻辑:例如,你可以先筛选出符合条件的文档,然后在应用程序层面进行进一步处理。
示例代码
假设我们有一个用户模型,其中包含 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
字段使用正则表达式,因为我们知道这会导致类型转换错误。
如果你确实需要对数字字段进行某种形式的匹配,那么你应该在应用程序层面实现这种逻辑,而不是在数据库查询中使用正则表达式。