$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
在这个例子中可能可以工作,但是在生产环境中这两个字段的类型可能是字符串,如果是字符串类型我不想进行转换。游乐场:
$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
来摆脱临时字段。