MongoDB使用aggregate时$type无法正确识别Object类型问题求助
问题根因
你遇到的矛盾是MongoDB中两种$type运算符的默认行为差异导致的:
$match阶段使用的是查询类$type运算符,默认采用「包含匹配」逻辑:如果字段值是数组,会判断数组内是否存在至少一个元素符合指定类型,而非判断字段本身的类型是否为object。你遇到的匹配到的记录实际是foo为数组、且数组内包含object类型元素的情况。$project阶段使用的是聚合类$type运算符,只会返回字段本身的BSON类型,因此数组类型的foo字段会直接返回array,和内部元素类型无关。
修复方案
如果需要精准匹配foo字段本身类型为object(排除所有数组类型的取值),有两种实现方式:
- 通用兼容写法(支持所有支持
$expr的MongoDB版本,3.6+):
在$match中用$expr调用聚合$type做类型判断:
db.baa.aggregate([ { $match: { $expr: { $eq: [ { $type: "$foo" }, "object" ] } } }, {$project: { foo : { $type: "$foo" }}} ])
- 高版本简化写法(MongoDB 4.4及以上):
查询类$type支持$eq修饰符强制精确匹配字段本身类型:
db.baa.aggregate([ {$match: { foo : {$type: { $eq: "object" }} }}, {$project: { foo : { $type: "$foo" }}} ])
修改后查询返回的结果就只会包含foo本身为object类型的记录,可以直接用于后续的批量更新操作。
内容的提问来源于stack exchange,提问作者vtolentino
相关产品推荐
相关产品推荐

