spring - MongoDB比较运算符与null

标签 spring mongodb null spring-mongo

在 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 :

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

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

这是一个错误吗?

更新答案:

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

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


原答案:

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

general consensus for Javascriptundefined表示 未分配null表示已分配但未定义。除了相等之外,与 undefined 的值比较没有任何意义,至少在数学意义上是这样。

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

关于spring - MongoDB比较运算符与null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29835829/

相关文章:

spring - 使用 Angular2 将 MultipartFile 作为请求参数发送到 REST 服务器

Spring MVC GetMapping 不生效

java - 获取 Spring bean 的真实 Class 对象

python - 如何多线程 Flask 服务器和 python 脚本?

java - Queue.Poll() 返回 null 但 Queue.size() >0 在 java 队列中

java - 如何为 @Async 方法使用自定义执行器?

mongodb - NoSQL 数据库 : what about read consistency?

Java Spring Mongo 排序忽略大小写问题

javascript - 如何检查 GAS 中文件是否存在(通过 id)

javascript - Google 表格 - 表单提交时的格式日期