MongoDB $lookup聚合管道中如何判断指定字段不存在
如何在
$lookup表达式内校验字段不存在 同类问题给出的{$eq : null}、$exists:true等方案均无法满足需求。
场景示例:需要仅在disabled字段不存在时,才关联查询inventory集合,初始编写的聚合查询代码如下:
db.orders.aggregate([ { $lookup: { from: "inventory", let: {item: "$item"}, pipeline: [ { $match: { $expr: { $and: [ { $eq: ["$sku", "$$item" ] }, { $eq: [ "$disabled", null ] } ] } } }, ], as: "inv" } } ])
问题原因
初始写法里{ $eq: [ "$disabled", null ] }无法精准匹配字段不存在的场景,它会同时命中两类文档:
disabled字段完全不存在的文档disabled字段存在,但值为null的文档
另外$exists是普通查询语法的运算符,无法直接在$expr聚合表达式内使用,因此在$lookup的子pipeline中不能直接靠它判断字段存在性。
正确写法
使用聚合运算符$type判断字段类型:当文档中不存在指定字段时,$type返回的类型标识为"missing",可以精准匹配字段不存在的场景。
将原来判断disabled的条件替换为以下写法即可:
{ $eq: [ { $type: "$disabled" }, "missing" ] }
完整可用的聚合代码:
db.orders.aggregate([ { $lookup: { from: "inventory", let: { item: "$item" }, pipeline: [ { $match: { $expr: { $and: [ { $eq: ["$sku", "$$item"] }, { $eq: [ { $type: "$disabled" }, "missing" ] } ] } } } ], as: "inv" } } ])
补充说明:如果业务逻辑允许同时匹配「字段不存在」和「字段值为null」两种场景,才可以使用
{ $eq: ["$字段名", null] }的简写;如果需要严格区分两种状态,必须使用$type判断missing类型的方案。
内容的提问来源于stack exchange,提问作者Ahmed Ashour
相关产品推荐
相关产品推荐

