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

如何在Mongoose聚合中对字符串数组及其他字段应用正则匹配

解决Mongoose多字段正则匹配(含映射整数与数组字段)

完整聚合管道代码

假设你的field3静态映射对象为field3Mapping(比如{ 1: "苹果", 2: "香蕉", 3: "橙子" }),以下是包含四个字段匹配的完整实现:

// 定义field3的静态映射
const field3Mapping = {
  1: "苹果",
  2: "香蕉",
  3: "橙子"
  // 补充你的其他映射关系
};

const [{ items }] = await this.inventoryModel.aggregate([
  { $match: { user }},
  {
    $project: {
      items: {
        $slice: [
          {
            $filter: {
              input: '$items',
              as: 'item',
              cond: {
                $or: [
                  // field1正则匹配
                  {
                    $regexMatch: {
                      input: '$$item.field1',
                      regex: `(?i)${query}`,
                    },
                  },
                  // field2正则匹配
                  {
                    $regexMatch: {
                      input: '$$item.field2',
                      regex: `(?i)${query}`,
                    },
                  },
                  // field3(整数转映射字符串)正则匹配
                  {
                    $regexMatch: {
                      input: { $let: {
                        vars: { mappedStr: { $arrayElemAt: [
                          Object.values(field3Mapping),
                          { $subtract: ['$$item.field3', 1] } // 假设field3是从1开始的整数
                        ]}},
                        in: '$$mappedStr'
                      }},
                      regex: `(?i)${query}`,
                    },
                  },
                  // field4(字符串数组)匹配:数组中任意元素符合正则
                  {
                    $anyElementTrue: {
                      $map: {
                        input: '$$item.field4',
                        as: 'elem',
                        in: {
                          $regexMatch: {
                            input: '$$elem',
                            regex: `(?i)${query}`,
                          }
                        }
                      }
                    }
                  }
                ],
              },
            },
          },
          50,
        ],
      },
      _id: 0,
    },
  },
]);

关键部分说明

1. field3的映射匹配逻辑

如果field3是连续整数映射,用$arrayElemAt结合Object.values(field3Mapping)直接转换;若映射键非连续,改用$switch实现:

// 非连续整数映射的写法示例
input: { $switch: {
  branches: [
    { case: { $eq: ['$$item.field3', 1] }, then: "苹果" },
    { case: { $eq: ['$$item.field3', 5] }, then: "葡萄" },
    // 补充其他映射分支
  ],
  default: "" // 无匹配时的默认值
}}

转换完成后对映射字符串执行$regexMatch即可。

2. field4的数组元素匹配逻辑

  • 用$map遍历field4数组的每个元素,对每个元素执行$regexMatch,得到一个布尔值数组;
  • 用$anyElementTrue判断布尔数组中是否存在true,即数组中是否有任意元素符合正则条件。

内容的提问来源于stack exchange,提问作者Sniper Noob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 09:47:08