You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Node-Express接口的URL过滤器转为MongoDB正则查询?

问题:Node-Express接口中MongoDB正则表达式过滤器无法生效

我有一个Node-Express接口,接收多个URL参数作为过滤器,示例请求如下:

{{baseUrl}}/projects?page=1&name=myProject

请求随后会转换为MongoDB查询。

模型定义

const projectSchema = mongoose.Schema({
  name: {
    type: String,
    required: true,
  },
  users: [{ type: mongoose.Schema.Types.ObjectId, ref: 'User' }],
});

const Project = mongoose.model('Project', projectSchema);

当前处理代码

const filter = pick(req.query, ['name']);
const options = pick(req.query, ['sortBy', 'limit', 'page']);
options.populate = 'users';
const result = await projectService.queryProjects(filter, options, req.user);

正常情况下该逻辑运行良好,但当使用/MyProject/这类MongoDB过滤表达式时,过滤器会被当作字符串而非正则表达式传入。

当前输出

// current result
console.log(filter);
// Output: { name: '/MyProject/' }

期望输出

// expected result
const test = { name: /MyProject/ };
console.log(test);
// Output { name: /MyProject/ }

请问需要修改什么才能得到预期结果?


解决方案

需要对提取到的name参数做格式判断,将符合正则表达式格式的字符串转换为真正的正则对象,修改后的代码如下:

基础版本(支持基础正则)

const filter = pick(req.query, ['name']);

// 处理name参数为正则表达式
if (filter.name && typeof filter.name === 'string' && /^\/.+\/$/.test(filter.name)) {
  const regexContent = filter.name.slice(1, -1);
  filter.name = new RegExp(regexContent);
}

const options = pick(req.query, ['sortBy', 'limit', 'page']);
options.populate = 'users';
const result = await projectService.queryProjects(filter, options, req.user);

进阶版本(支持正则修饰符)

如果需要支持正则修饰符(如大小写不敏感/MyProject/i),可以扩展逻辑提取修饰符:

const filter = pick(req.query, ['name']);

// 处理带修饰符的正则表达式
if (filter.name && typeof filter.name === 'string') {
  const regexMatch = filter.name.match(/^\/(.+)\/([gimsuy]*)$/);
  if (regexMatch) {
    const [, pattern, flags] = regexMatch;
    filter.name = new RegExp(pattern, flags);
  }
}

const options = pick(req.query, ['sortBy', 'limit', 'page']);
options.populate = 'users';
const result = await projectService.queryProjects(filter, options, req.user);

说明

  • 基础版本会检查name参数是否以/开头和结尾,若是则提取中间内容创建正则对象。
  • 进阶版本额外支持提取正则修饰符(如g全局匹配、i忽略大小写等),适配更复杂的查询需求。

内容的提问来源于stack exchange,提问作者Jens Kock

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 04:45:45