如何让MongoDB $eq聚合运算符忽略数字的类型比较?
MongoDB:数字类型字段忽略类型的等值匹配方法
MongoDB的$eq运算符会同时比较值和类型,当两个字段是不同类型的数字(比如Decimal128和双精度浮点数)时,无法匹配成功。但我们希望仅在两个字段均为数字类型时忽略类型差异匹配,若字段是字符串类型则保持严格的类型+值匹配。
示例场景
数据集:
[ { "field1": { "$numberDecimal": "0.99" }, "field2": 0.99 }, { "field1": "0.99", "field2": 0.99 } ]
原查询(无法匹配第一个文档):
db.collection.aggregate([ { "$match": { "$expr": { "$eq": ["$field1", "$field2"] } } } ])
直接使用$convert会把字符串类型也转为数字,不符合需求,需要针对性处理。
解决方案
通过$type判断字段类型,仅对数字类型做统一转换后比较,非数字类型保持严格匹配:
db.collection.aggregate([ { "$match": { "$expr": { "$cond": [ { "$and": [ { "$in": [{ "$type": "$field1" }, ["double", "decimal", "int", "long"]] }, { "$in": [{ "$type": "$field2" }, ["double", "decimal", "int", "long"]] } ] }, // 均为数字时统一转Decimal后比较 { "$eq": [{ "$toDecimal": "$field1" }, { "$toDecimal": "$field2" }] }, // 非数字时严格匹配 { "$eq": ["$field1", "$field2"] } ] } } } ])
说明
- 用
$type识别字段是否属于数字类型(涵盖double、decimal、int、long等常见数字类型) - 当两个字段都是数字时,统一转换为Decimal128(或根据需求转Double)后比较,忽略原类型差异
- 只要有一个字段不是数字,就执行
$eq的严格匹配,保证字符串等类型的匹配逻辑不变
内容的提问来源于stack exchange,提问作者Xin Zhang
相关产品推荐
相关产品推荐

