MongoDB比较运算符为null

时间:2015-04-23 23:00:14

标签: spring mongodb null spring-mongo

在MongoDB中,我想使用$ gt和$ lt比较运算符,其值可能是 null 。当运算符不能与 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错误,还是它实际上应该可以工作并且可能存在用户错误?

1 个答案:

答案 0 :(得分:10)

Nitty-Gritty详细信息

阅读latest Mongo source,在进行涉及null的比较时,基本上有两种情况:

  1. 如果要比较的BSON元素的canonical types不同,则只有等式比较(==>=<=)为null&amp; undefined将返回true;否则与null的任何比较都将返回false
    注意:没有其他BSON类型与null具有相同的规范类型。
  2. 如果canonical types相同(即两个元素都是null),则调用compareElementValues。对于null,这只返回两个BSON元素的canonical type之间的差异,然后针对0执行请求的比较。
    例如,null > null会转换为(5-5) > 0 --> False,因为规范类型的null为5 同样,null < null会转换为(5-5) < 0 --> False
  3. 这意味着null只能等于nullundefined。涉及null的任何其他比较将始终返回false

    这是一个Bug吗?

    更新了答案:

    比较运算符($gt$lt)的文档引用了the documentation which you originally linked,这意味着比较运算符应该null一起使用。此外,查询排序(即。db.find().sort()确实准确地遵循记录的比较/排序行为。

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

    原始答案:

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

    general consensus for Javascript undefined表示未分配,而null表示已分配但未定义。除了平等之外,对未定义的价值比较至少在数学意义上是不合理的。

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