如何通过正则匹配pName和pCode检索产品并返回product数组指定字段
实现方案
你可以使用MongoDB的聚合管道完成该需求,核心思路是先筛选包含符合条件产品的父文档,再根据输出格式要求选择对应处理逻辑。
方案1:输出独立的产品文档(符合条件的产品单独成条)
如果需要把匹配到的所有产品拆成独立条目返回,仅保留指定字段,参考代码如下(示例条件为匹配pName包含jeans、pCode包含J,返回pName/pCode/pPrice三个字段):
db.collection.aggregate([ // 第一步:提前过滤无符合条件产品的文档,缩小查询范围 { $match: { $or: [ { "product.pName": { $regex: /jeans/, $options: "i" } }, { "product.pCode": { $regex: /J/, $options: "i" } } ] } }, // 第二步:拆分product数组,把每个产品转化为独立文档 { $unwind: "$product" }, // 第三步:精准匹配单个产品的正则规则 { $match: { $or: [ { "product.pName": { $regex: /jeans/, $options: "i" } }, { "product.pCode": { $regex: /J/, $options: "i" } } ] } }, // 第四步:指定返回字段,不需要的字段设为0即可 { $project: { _id: 0, pName: "$product.pName", pCode: "$product.pCode", pPrice: "$product.pPrice" } } ])
方案2:保留原文档结构,仅过滤数组内符合条件的产品
如果需要保留原文档的层级结构,只剔除product数组中不符合条件的元素,参考代码如下:
db.collection.aggregate([ // 第一步:提前过滤无符合条件产品的文档 { $match: { $or: [ { "product.pName": { $regex: /jeans/, $options: "i" } }, { "product.pCode": { $regex: /J/, $options: "i" } } ] } }, // 第二步:过滤product数组中不符合规则的元素 { $addFields: { product: { $filter: { input: "$product", cond: { $or: [ { $regexMatch: { input: "$$this.pName", regex: /jeans/, options: "i" } }, { $regexMatch: { input: "$$this.pCode", regex: /J/, options: "i" } } ] } } } } }, // 第三步:指定返回字段 { $project: { _id: 0, "product.pName": 1, "product.pCode": 1, "product.pPrice": 1 } } ])
参数说明
- 正则配置的
$options: "i"表示忽略大小写,不需要可直接删除 - 如果需要同时满足pName和pCode的正则条件,把查询条件中的
$or改为$and即可 - 可根据实际需求调整
$project配置,新增/删减需要返回的字段
内容的提问来源于stack exchange,提问作者Sahin Reja
相关产品推荐
相关产品推荐

