如何忽略 MongoDB $eq 数字聚合运算符的类型比较?

问题描述 投票:0回答:1

$eq 运算符比较 MongoDB 中的值和类型,如 https://www.mongodb.com/docs/manual/reference/operator/aggregation/eq 中所述。

当两个表达式都是数字时,有什么方法可以忽略类型比较吗?

这是一个例子,数据集就像

[
  {
    "field1": {
      "$numberDecimal": "0.99"
    },
    "field2": 0.99
  }
]

由于field1和field2的类型不同,查询没有返回任何文档。然而,这种情况下的匹配是我所期望的。

db.collection.aggregate([
  {
    "$match": {
      "$expr": {
        "$eq": [
          "$field1",
          "$field2"
        ]
      }
    }
  }
])

在这个例子中,$eq操作之前的$convert可能会起作用,但是在生产环境中这两个字段的类型可能是字符串,如果是字符串类型我不想进行转换。

游乐场:https://mongoplayground.net/p/v7XaiQHuINr

mongodb mongodb-query aggregation-framework
1个回答
0
投票

如果第一步中字段是数字,您可以添加

$set
阶段将字段转换为小数。如果字段不是数字,则按原样使用其值。

之后,比较将起作用,您可以在

$unset
阶段删除附加字段:

db.collection.aggregate([
  {
    "$set": {
      field1Normalized: {
        $cond: {
          if: {
            $isNumber: "$field1"
          },
          then: {
            $toDecimal: "$field1"
          },
          else: "$field1"
        }
      },
      field2Normalized: {
        $cond: {
          if: {
            $isNumber: "$field2"
          },
          then: {
            $toDecimal: "$field2"
          },
          else: "$field2"
        }
      }
    }
  },
  {
    "$match": {
      "$expr": {
        "$eq": [
          "$field1Normalized",
          "$field2Normalized"
        ]
      }
    }
  },
  {
    $unset: [
      "field1Normalized",
      "field2Normalized"
    ]
  }
])

请参阅此 mongoplayground 进行测试。

© www.soinside.com 2019 - 2024. All rights reserved.