MongoDB比较运算符为null

Try*_*his 10 null spring mongodb spring-mongo

在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
}
Run Code Online (Sandbox Code Playgroud)

我希望以下查询:

db.testtable.find( { "colNum" { $gt : null } } )
Run Code Online (Sandbox Code Playgroud)

回来:

{
  id: 2,
  colNum: 72
}
Run Code Online (Sandbox Code Playgroud)

但是,没有返回任何内容.

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

cyf*_*r01 10

Nitty-Gritty细节

通过阅读最新的Mongo源,在进行比较时基本上有两种情况涉及null:

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

这意味着null只能等于nullundefined.任何其他涉及的比较null将始终返回false.

这是一个Bug吗?

更新答案:

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

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


原答案:

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

Javascript的普遍共识是,undefined意味着未分配null手段分配,但另外未定义.除了平等之外,对未定义的值进行比较是没有意义的,至少在数学意义上是这样.

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