11

在 MongoDB 中,我想使用 $gt 和 $lt 比较运算符,其中的值可以是null。当操作员不使用null时,我查找了文档但没有找到。在这两种情况下,它都没有返回任何文档(尽管 $ne、$gte 和 $lte 确实返回了文档;这意味着存在既等于又不等于null的文档)。

我希望 $gt 基本上像 $ne 一样运行(因为null类型的Mongo comarison 订单非常低)并且 $lt 出于同样的原因不返回任何内容。

我希望这会起作用,因为我传递给查询的值是可变的(可能是null),我不想为null写一个特殊情况。

给定以下集合,我所期待的示例:

{
  id: 1,
  colNum: null
}
{
  id: 2,
  colNum: 72
}
{
  id: 3
}

我期望以下查询:

db.testtable.find( { "colNum" { $gt : null } } )

返回:

{
  id: 2,
  colNum: 72
}

然而,什么都没有返回。

是否有原因 $gt 和 $lt 似乎不适用于null,或者它是 MongoDB 错误,还是它实际上应该工作并且可能存在用户错误?

4

1 回答 1

15

细节

通读最新的 Mongo 源码,在进行比较时基本上有两种情况null

  1. 如果被比较的 BSON 元素的规范类型==不同,则只有 null 和 undefined 的相等比较 ( , >=, <=) 将返回true; 否则任何与的比较null都会返回false
    注意:没有其他 BSON 类型具有与null.
  2. 如果规范类型相同(即两个元素都是null),则调用compareElementValues。因为,这只是返回两个 BSON 元素的规范类型null之间的差异,然后执行请求的比较。 例如,将转换为,因为 null 的规范类型是 5。 类似地,将转换为.0
    null > null(5-5) > 0 --> False
    null < null(5-5) < 0 --> False

这意味着null永远只能等于nullor undefined。任何其他涉及的比较null总是会返回false

这是一个错误吗?

更新答案:

比较运算符($gt$lt的文档引用了您最初链接的文档,这意味着比较运算符应该使用null。此外,查询排序(db.find().sort()确实准确地遵循了记录的比较/排序行为。

这至少是不一致的。我认为向MongoDB 的 JIRA 站点提交错误报告是值得的。


原答案:

我不认为这种行为是一个错误。

Javascript的普遍共识是,这undefined意味着unassignednull意味着已分配但在其他方面是 undefined。除了相等之外,与 undefined 的值比较是没有意义的,至少在数学意义上是没有意义的。

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

于 2015-04-24T01:59:21.897 回答