11

MongoDB では、値がnullになる可能性のある $gt および $lt 比較演算子を使用したいと考えています。演算子が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 sourceを読むと、以下を含む比較を行う場合、基本的に 2 つのケースがありnullます。

  1. 比較される BSON 要素の正規型が異なる場合、 null と undefined の等値比較 ( ==>=、 ) のみが返されます。それ以外の場合、 との比較はを返します。注:と同じ正規型を持つ BSON 型は他にありません。<=truenullfalse
    null
  2. 正規型が同じ場合(つまり、両方の要素がである場合null)、compareElementValuesが呼び出されます。の場合、これは両方の BSON 要素の正規型nullの違いを返すだけで、要求された比較を に対して実行します。 たとえば、null の正規型は 5 であるため、は に変換されます。 同様に、は に変換されます。0
    null > null(5-5) > 0 --> False
    null < null(5-5) < 0 --> False

これは、またはnullにしか等しくならないことを意味します。を含むその他の比較は、常に を返します。nullundefinednullfalse

これはバグですか?

更新された回答:

比較演算子 ( $gt$lt )のドキュメントは、最初にリンクしたドキュメントを参照しています。これは、比較演算子を使用する必要があることを意味しnullます。さらに、クエリの並べ替え (つまりdb.find().sort())、文書化されている比較/並べ替えの動作に正確に従います。

これは、少なくとも矛盾しています。MongoDB の JIRA サイトにバグ レポートを提出する価値があると思います。


元の回答:

この動作はバグではないと思います。

Javascriptの一般的なコンセンサスは、unassignedundefined意味し、それ以外の場合は undefinedを意味します。undefined に対する値の比較は、同等性は別として、少なくとも数学的な意味では意味がありません。null

BSON が JavaScript から多くを引き出すことを考えると、これは MongoDB にも当てはまります。

于 2015-04-24T01:59:21.897 に答える