$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可能会起作用,但是在生产环境中这两个字段的类型可能是字符串,如果是字符串类型我不想进行转换。
如果第一步中字段是数字,您可以添加
$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 进行测试。