MongoDB 与 null 的比较运算符
MongoDB comparison operators with null
在 MongoDB 中,我想使用 $gt 和 $lt 比较运算符,其中值可以是 null。当运算符不使用 null 时,我查找了文档但找到了 none。在这两种情况下,它 return 都没有文档(即使 $ne、$gte 和 $lte 做了 return 文档;这意味着有些文档既等于又不等于 空).
我希望 $gt 本质上像 $ne 一样运行(因为 null 类型 Mongo comarison order 太低了)而 $lt 到 return 什么都没有出于同样的原因。
我希望这会起作用,因为我传递给查询的值是可变的(可能 null),我不想为空.
我所期望的示例,给出以下集合:
{
id: 1,
colNum: null
}
{
id: 2,
colNum: 72
}
{
id: 3
}
我希望得到以下查询:
db.testtable.find( { "colNum" { $gt : null } } )
至return:
{
id: 2,
colNum: 72
}
然而,return什么也没有。
$gt 和 $lt 似乎不能与 null 一起工作是有原因的,还是 MongoDB 错误,或者它实际上应该是工作,可能是用户错误?
细节
通读latest Mongo source,比较涉及null
:
基本上有2种情况
- 如果被比较的BSON元素的canonical types不同,只有null & undefined的相等比较(
==
、>=
、<=
)才会return true
;否则任何与 null
的比较都会 return false
。
注意:没有其他 BSON 类型具有与 null
. 相同的规范类型
- 如果 canonical types 相同(即两个元素都是
null
),则调用 compareElementValues。对于 null
,这只是 return 两个 BSON 元素的 规范类型 之间的差异,然后与 0
进行请求的比较。
例如,null > null
将转换为 (5-5) > 0 --> False
,因为 null 的规范类型是 5.
同样,null < null
将转换为 (5-5) < 0 --> False
。
这意味着 null
只能等于 null
或 undefined
。涉及 null
的任何其他比较将始终 return false
.
这是一个错误吗?
更新答案:
比较运算符 ($gt, $lt) references the documentation which you originally linked 的文档,这意味着比较运算符 应该 与 null
一起使用。此外,查询排序 (即、db.find().sort()
) 确实准确地遵循记录的Comparison/Sort行为。
这至少是不一致的。我认为向 MongoDB's JIRA site.
提交错误报告是值得的
原答案:
我不认为这种行为是错误。
general consensus for Javascript 是 undefined
表示 未分配 而 null
表示 已分配但未定义 .与 undefined 的值比较,除了相等之外,没有任何意义,至少在数学意义上是这样。
鉴于 BSON 大量借鉴 JavaScript,这也适用于 MongoDB。
在 MongoDB 中,我想使用 $gt 和 $lt 比较运算符,其中值可以是 null。当运算符不使用 null 时,我查找了文档但找到了 none。在这两种情况下,它 return 都没有文档(即使 $ne、$gte 和 $lte 做了 return 文档;这意味着有些文档既等于又不等于 空).
我希望 $gt 本质上像 $ne 一样运行(因为 null 类型 Mongo comarison order 太低了)而 $lt 到 return 什么都没有出于同样的原因。
我希望这会起作用,因为我传递给查询的值是可变的(可能 null),我不想为空.
我所期望的示例,给出以下集合:
{
id: 1,
colNum: null
}
{
id: 2,
colNum: 72
}
{
id: 3
}
我希望得到以下查询:
db.testtable.find( { "colNum" { $gt : null } } )
至return:
{
id: 2,
colNum: 72
}
然而,return什么也没有。
$gt 和 $lt 似乎不能与 null 一起工作是有原因的,还是 MongoDB 错误,或者它实际上应该是工作,可能是用户错误?
细节
通读latest Mongo source,比较涉及null
:
- 如果被比较的BSON元素的canonical types不同,只有null & undefined的相等比较(
==
、>=
、<=
)才会returntrue
;否则任何与null
的比较都会 returnfalse
。
注意:没有其他 BSON 类型具有与null
. 相同的规范类型
- 如果 canonical types 相同(即两个元素都是
null
),则调用 compareElementValues。对于null
,这只是 return 两个 BSON 元素的 规范类型 之间的差异,然后与0
进行请求的比较。
例如,null > null
将转换为(5-5) > 0 --> False
,因为 null 的规范类型是 5.
同样,null < null
将转换为(5-5) < 0 --> False
。
这意味着 null
只能等于 null
或 undefined
。涉及 null
的任何其他比较将始终 return false
.
这是一个错误吗?
更新答案:
比较运算符 ($gt, $lt) references the documentation which you originally linked 的文档,这意味着比较运算符 应该 与 null
一起使用。此外,查询排序 (即、db.find().sort()
) 确实准确地遵循记录的Comparison/Sort行为。
这至少是不一致的。我认为向 MongoDB's JIRA site.
提交错误报告是值得的原答案:
我不认为这种行为是错误。
general consensus for Javascript 是 undefined
表示 未分配 而 null
表示 已分配但未定义 .与 undefined 的值比较,除了相等之外,没有任何意义,至少在数学意义上是这样。
鉴于 BSON 大量借鉴 JavaScript,这也适用于 MongoDB。