MongoDB使用$elemMatch过滤Agency集合未获预期结果求助
MongoDB: 如何只返回数组中匹配条件的子元素
我明白你的问题了——你用$elemMatch成功找到了包含符合条件的apps子文档的Agency记录,但返回结果里的apps数组把所有子元素都带回来了,而你只想保留那些匹配name和pincodes条件的子项对吧?
这是因为查询条件里的$elemMatch只是用来判断整个文档是否符合查询要求(即是否存在满足条件的子元素),它不会自动过滤数组中的非匹配元素。要实现你想要的输出,需要在查询时加上**投影(Projection)**来控制返回的数组内容,或者用聚合管道来处理。
方法1:投影中使用$elemMatch(适合单个匹配项场景)
你可以在查询的第二个参数(投影参数)里再次使用$elemMatch,这样MongoDB只会返回apps数组中符合条件的第一个匹配项:
db.Agency.find( {'apps':{$elemMatch:{name: {$regex: 'DSB', $options: 'i'} ,pincodes: { $in : ['135001','134002']}}}}, {'apps': {$elemMatch:{name: {$regex: 'DSB', $options: 'i'} ,pincodes: { $in : ['135001','134002']}}}} )
这个方法简单直接,但如果同一个apps数组中有多个符合条件的子文档,它只会返回第一个匹配的条目。
方法2:使用聚合管道(支持多个匹配项,更灵活)
如果你的场景中可能有多个apps子文档符合条件,想要全部保留的话,用$filter聚合操作符会更合适:
db.Agency.aggregate([ // 第一步:筛选出包含符合条件apps的文档 {$match: { 'apps': { $elemMatch: { name: {$regex: 'DSB', $options: 'i'}, pincodes: {$in: ['135001','134002']} } } }}, // 第二步:过滤apps数组,只保留符合条件的子文档 {$addFields: { apps: { $filter: { input: '$apps', cond: { $and: [ {$regexMatch: {input: '$$this.name', regex: 'DSB', options: 'i'}}, {$in: ['$$this.pincodes', ['135001','134002']]} ] } } } }} ])
这个方法会把apps数组中所有符合条件的子文档都保留下来,比投影的方式适用范围更广。
以上两种方法都能让你得到期望的输出:返回的Agency文档中,apps数组只包含匹配name为DSB且pincodes在指定列表里的子元素。
内容的提问来源于stack exchange,提问作者user944513
相关产品推荐
相关产品推荐

