如何忽略 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"
        ]
      }
    }
  }
])

$convert

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

游乐场:

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 进行测试。

正如 @Joe 在评论中提到的,您可以在

$cond

 阶段包含 
$match
 来摆脱临时字段。

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