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