MongoDB查询:如何仅返回promotedtitles数组中匹配国家的子文档
MongoDB 嵌套数组按国家条件过滤子文档方案
问题原因
你之前使用promotedtitles.countries : {$in : ['US', 'CA']}的写法只能筛选出「promotedtitles数组中至少有一个子文档满足国家匹配条件」的顶层文档,无法过滤掉promotedtitles数组中不符合条件的子文档,自然达不到需求。
正确实现方案
使用MongoDB聚合管道的$filter操作符对promotedtitles数组做过滤即可,完整查询语句如下(示例传入参数为["GB", "CA"]):
db.你的集合名.aggregate([ // 可选步骤:提前过滤掉完全没有符合条件子文档的顶层文档,减少计算量 { $match: { "promotedtitles.countries": { $in: ["GB", "CA"] } } }, // 核心步骤:过滤promotedtitles数组,仅保留符合条件的子文档 { $project: { // 按需保留需要返回的顶层字段,不需要的可以删除或者设置为0 name: 1, campaigntype: 1, startdate: 1, enddate: 1, active: 1, promotedtitles: { $filter: { input: "$promotedtitles", as: "item", // 判断子文档的国家数组和传入参数是否有交集 cond: { $gt: [ { $size: { $setIntersection: ["$$item.countries", ["GB", "CA"]] } }, 0 ] } } } } } ])
使用说明
你只需要把上述代码中所有的["GB", "CA"]替换为你实际传入的国家参数即可,支持单元素数组(如["US"])、多元素数组(如["US", "CA"])两种形式,完全匹配你给出的三条匹配规则。
内容的提问来源于stack exchange,提问作者jvm
相关产品推荐
相关产品推荐

