MongoDB聚合查询:如何用$or匹配两数组中指定agent的文档
解决方案
要实现同时从carPolicies和paPolicies数组中筛选出指定agent的policy,并输出为单独的文档,你需要调整聚合管道的几个阶段,具体如下:
1. 扩展匹配条件($match阶段)
首先用$or操作符扩展匹配规则,确保能命中所有包含符合条件的carPolicies或paPolicies的文档,避免漏掉符合要求的记录:
{ $match: { $or: [ { 'carPolicies.policy.agent': req.params.name }, { 'paPolicies.policy.agent': req.params.name } ] } }
2. 过滤并合并数组($project阶段)
在这一步,我们分别对两个数组进行精准过滤,只保留agent匹配目标值的项,再用$concatArrays把两个过滤后的数组合并成一个统一的数组,方便后续处理:
{ $project: { filteredPolicies: { $concatArrays: [ { $filter: { input: '$carPolicies', as: 'cp', cond: { $eq: ['$$cp.policy.agent', req.params.name] } } }, { $filter: { input: '$paPolicies', as: 'pp', cond: { $eq: ['$$pp.policy.agent', req.params.name] } } } ] }, _id: 0 } }
3. 拆分数组为独立文档($unwind阶段)
使用$unwind操作符把合并后的数组拆分成单个文档,这样每个符合条件的policy都会成为一条独立的记录,对应你想要的输出格式:
{ $unwind: '$filteredPolicies' }
4. 整理最终输出($project阶段)
最后提取出policy字段,剔除多余的结构,得到干净的输出结果:
{ $project: { policy: '$filteredPolicies.policy' } }
完整聚合查询
把以上阶段组合起来,完整的代码如下:
db.collection('users').aggregate([ { $match: { $or: [ { 'carPolicies.policy.agent': req.params.name }, { 'paPolicies.policy.agent': req.params.name } ] } }, { $project: { filteredPolicies: { $concatArrays: [ { $filter: { input: '$carPolicies', as: 'cp', cond: { $eq: ['$$cp.policy.agent', req.params.name] } } }, { $filter: { input: '$paPolicies', as: 'pp', cond: { $eq: ['$$pp.policy.agent', req.params.name] } } } ] }, _id: 0 } }, { $unwind: '$filteredPolicies' }, { $project: { policy: '$filteredPolicies.policy' } } ])
这个查询会从你的示例数据中提取出4条agent为"47"的policy记录,完全符合预期输出,同时自动排除agent为"99"的项。
内容的提问来源于stack exchange,提问作者Brio Tech
相关产品推荐
相关产品推荐

