MongoDB数组字段查询:$filter筛选时如何添加任意标签匹配条件
实现方案
你需要的「tags至少包含指定列表中一个元素」的逻辑,可通过$setIntersection计算两个数组的交集,再判断交集长度是否大于0实现。
首先注意你原有聚合代码里存在一处笔误:$filter的as字段指定的变量名为users,但条件里用了$$user.age,两者命名不统一会导致查询失效,建议先将as修改为user。
修改后的完整聚合语句如下:
[ { "$match": { "_id": "a506f8af6f510f616bea14715276d474d2b363f0aef10443cc0f11559b139147" } }, { "$project": { "users": { "$filter": { "input": "$users", "as": "user", "cond": { "$and": [ { "$gte": ["$$user.age", 15] }, // 新增的标签筛选条件,["a", "x"]替换为你要匹配的标签列表 { "$gt": [ { "$size": { "$setIntersection": ["$$user.tags", ["a", "x"]] } }, 0 ] } ] } } } } } ]
条件逻辑说明
$setIntersection: ["$$user.tags", ["a", "x"]]会返回两个数组的公共元素组成的新数组$size计算交集数组的长度$gt判断长度是否大于0,大于0即说明存在至少一个匹配的标签
如果你使用的是MongoDB 4.4及以上版本,也可以用更简洁的$anyElementTrue配合$map实现,效果完全一致:
{ "$anyElementTrue": { "$map": { "input": ["a", "x"], "in": { "$in": ["$$this", "$$user.tags"] } } } }
内容的提问来源于stack exchange,提问作者Manisekhar Simhadri
相关产品推荐
相关产品推荐

