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种情况
  1. 如果被比较的BSON元素的canonical types不同,只有null & undefined的相等比较(==>=<=)才会return true;否则任何与 null 的比较都会 return false
    注意:没有其他 BSON 类型具有与 null.
  2. 相同的规范类型
  3. 如果 canonical types 相同(即两个元素都是 null),则调用 compareElementValues。对于 null,这只是 return 两个 BSON 元素的 规范类型 之间的差异,然后与 0 进行请求的比较。
    例如,null > null 将转换为 (5-5) > 0 --> False,因为 null 的规范类型是 5.
    同样,null < null 将转换为 (5-5) < 0 --> False

这意味着 null 只能等于 nullundefined。涉及 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 Javascriptundefined 表示 未分配 null 表示 已分配但未定义 .与 undefined 的值比较,除了相等之外,没有任何意义,至少在数学意义上是这样。

鉴于 BSON 大量借鉴 JavaScript,这也适用于 MongoDB。