如何在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
相关产品推荐
相关产品推荐

