MongoDB聚合查询如何排除my_object._id存在于exclusion_object.my_arr的文档
错误原因
你之前的写法无法生效是因为常规$match的查询语法默认只能匹配常量值,无法直接引用同文档的其他字段,你的写法实际是把my_object._id和$exclusion_object.my_arr作为两个字符串常量,和exclusion_object.my_arr字段做匹配,完全没有读取文档内的实际字段值,所以不符合预期。
正确实现方案
你需要搭配$expr操作符,在$match阶段使用聚合表达式实现同文档字段的比较逻辑,写法如下:
{ $match: { $expr: { $not: { $in: ["$my_object._id", "$exclusion_object.my_arr"] } } } }
如果你的集合中存在部分文档没有exclusion_object.my_arr字段、或者该字段不是数组的情况,可以加$ifNull做兼容,避免查询报错:
{ $match: { $expr: { $not: { $in: ["$my_object._id", { $ifNull: ["$exclusion_object.my_arr", []] }] } } } }
逻辑说明
$expr允许在查询语句中使用聚合运算表达式,支持用$前缀引用同文档的字段值$in用来判断$my_object._id是否存在于$exclusion_object.my_arr数组中- 外层
$not对判断结果取反,最终只保留my_object._id不在排除数组中的文档
内容的提问来源于stack exchange,提问作者Loudrous
相关产品推荐
相关产品推荐

