MongoDB中如何在$map操作符内正确嵌入$exists操作符?
解决MongoDB $map中嵌入字段存在性检查的问题
问题根源
你在$map的in逻辑里用了查询阶段的$exists语法(也就是{isTypePattern: {$exists: false}}这种键值对结构),但$map属于聚合表达式上下文,这里只能用聚合操作符组成的表达式,不能直接套用查询条件的写法,这就是编译报错的原因。
正确实现方式
根据你要检查的是外层文档还是数组元素的isTypePattern字段,分两种场景:
场景1:检查整个文档不存在isTypePattern字段
如果需要确保当前查询的文档本身没有isTypePattern,同时entities数组里有元素匹配正则,用$type操作符判断字段类型为missing即可:
db.collection.find({ "$expr": { "$anyElementTrue": { "$map": { "input": "$entities", "in": { $and: [ { "$regexMatch": { "input": "Room1", "regex": "$$this.id", "options": "i" } }, // 聚合表达式中判断外层文档无isTypePattern字段 { $eq: [ { $type: "$isTypePattern" }, "missing" ] } ] } } } } })
场景2:检查entities数组元素不存在isTypePattern字段
如果需要确保entities数组中匹配正则的那个元素本身没有isTypePattern字段,就用$$this指向当前遍历的数组元素:
db.collection.find({ "$expr": { "$anyElementTrue": { "$map": { "input": "$entities", "in": { $and: [ { "$regexMatch": { "input": "Room1", "regex": "$$this.id", "options": "i" } }, // 聚合表达式中判断当前数组元素无isTypePattern字段 { $eq: [ { $type: "$$this.isTypePattern" }, "missing" ] } ] } } } } })
额外说明
在MongoDB聚合表达式里,判断字段是否存在的常用方法:
- 用
$type操作符:如果字段不存在,$type会返回"missing",直接和这个值比较即可 - 也可以用
$ifNull:$ifNull: ["$字段路径", "自定义标记"],若字段不存在会返回标记值,再判断是否等于标记值,但$type的写法更直接高效。
内容的提问来源于stack exchange,提问作者anupam
相关产品推荐
相关产品推荐

