61

Mongoドキュメントを作成していて、値がない場合があるフィールド{key: value}がある場合、2つのオプションがあるように思われます。

  1. 書き込み{key: null}、つまりフィールドにnull値を書き込みます
  2. そのドキュメントにキーをまったく保存しないでください

どちらのオプションも簡単にクエリできます。{key : null}一方をクエリし、もう一方をクエリします{key : {$exists : false}}

アプリケーションシナリオに影響を与える2つのオプションの違いを実際に考えることはできません(オプション2のストレージがわずかに少ないことを除いて)。

2つのアプローチのどちらかを他のアプローチよりも好む理由があるかどうか、そしてその理由を誰かに教えてもらえますか?

編集

質問をした後、2つのケースでインデックスの動作が異なる可能性があることにも気付きました。つまり、オプション2に対してスパースインデックスを作成できます。

4

4 に答える 4

42

確かにあなたには3番目の可能性もあります:( key: ""空の値)

そして、あなたはnull値についての特異性を忘れています。クエリをオンに すると、キーがnullである、キーが存在しないkey: nullすべてのドキュメントが取得されます。

クエリを実行する$exists:falseと、フィールドキーが存在しないドキュメントのみが取得されます。

正確な質問に戻るには、クエリとデータが何を表すかによって異なります。たとえば、ユーザーが値を設定してから設定を解除するなど、それを維持する必要がある場合は、フィールドをnullまたは空のままにしておく必要があります。必要がない場合は、このフィールドを削除できます。

于 2012-09-13T10:28:30.400 に答える
19

MongoDBはフィールド名辞書圧縮を使用field:nullしないため、ディスク領域とRAMを消費しますが、キーをまったく保存しないとリソースを消費しないことに注意してください。

于 2012-09-13T19:13:33.380 に答える
9

それは本当に次のことになります:

  • あなたのシナリオ
  • あなたの質問の仕方
  • インデックスのニーズ
  • あなたの言語

私は個人的にヌルキーを保存することを選択しました。それは私のアプリへの統合をはるかに簡単にします。私はアクティブレコードでPHPを使用しており、null値を使用すると、アプリにフィールド依存のストレスをかける必要がないため、作業がはるかに楽になります。また、存在しない変数を設定する魔法を処理するために複雑なコードを作成する必要はありません。

私は個人的には空の値を保存し""ません。注意しないと2つの空の値が存在する可能性がnullあり""、具体的にクエリを実行すると危険な時間が発生するからです。だから私は個人的nullに空の値を好みます。

スペースとインデックスに関しては、この列がない行の数によって異なりますが、nullが含まれるいくつかの追加のドキュメントが原因で、インデックスサイズが実際に増加することに気付くとは思えません。特に、対応する場合、ストレージの違いはわずかです。キー名も​​小さいです。これは大規模なセットアップにも当てはまります。

率直に言って、インデックスの使用法についてはよくわかりませんが$exists、MongoDBはスキーマレスであるため、存在をクエリするためのより標準化された方法である可能性があります。つまり、ドキュメントにそのフィールドを含める必要はなく、2つの空の値が生成されます。存在しないと。どちらかを選択する方が良いでしょう。nullnullnull

を選択しますnull

于 2012-09-13T22:17:31.707 に答える
2

考慮したいもう1つのポイントは、HibernateOGMなどのOGMツールを使用する場合です。

Javaを使用している場合、HibernateOGMはJPA標準をサポートします。したがって、JPQLクエリを記述できる場合、OGMツールでサポートされている代替のNoSQLデータストアに切り替えると、理論的には簡単になります。

JPAは、Mongoに$existsに相当するものを定義していません。したがって、コレクションにオプションの属性がある場合、同じものに対して適切なJPQLを作成することはできません。このような場合でも、属性の値がNULLとして格納されていれば、以下のように有効なJPQLクエリを作成することができます。

SELECT p FROM pppoe p where p.logout IS null;
于 2016-07-14T09:45:12.000 に答える