You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 18:07:26