【问题标题】:MongoDB comparison operators with nullMongoDB比较运算符与null
【发布时间】:2015-07-02 08:52:16
【问题描述】:

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

我希望 $gt 基本上像 $ne 一样运行(因为 null 类型 Mongo comarison order 太低了),并且出于同样的原因 $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 错误,还是它实际上应该工作并且可能存在用户错误?

【问题讨论】:

  • 那么你的问题是什么?
  • 哈! @SalvadorDali 好点。添加最后一段

标签: spring mongodb null spring-mongo


【解决方案1】:

具体细节

通读latest Mongo source,在做涉及null的比较时基本上有2种情况:

  1. 如果被比较的 BSON 元素的 canonical types 不同,则只有 null & 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

这意味着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。

【讨论】:

  • 感谢您的详细回答。这正是我想要的。我不确定我是否完全同意错误部分。我了解与 JavaScript 的历史关系,但此后它们发生了一些分歧。 Mongo 已弃用 Undefined。同样在 Mongo 文档中,我将其称为 Comparison /Sort Order。有人对此有想法吗?
  • 我错过了您的文档链接。文档所说的确实准确地适用于排序(iedb.find().sort()),但不适用于查询中的比较运算符(ie $gt$lt)。这当然令人困惑。
  • 请注意,聚合管道中的$lt$gt 运算符 与普通查询运算符中的$lt$gt 的作用不同。在聚合管道中undefined 值是“小于”null。这在标准查询中是不正确的。谢谢Mongo。
猜你喜欢
  • 2018-08-27
  • 1970-01-01
  • 2019-12-29
  • 2016-04-28
  • 2011-03-10
  • 1970-01-01
相关资源
最近更新 更多