2011-12-22 8 views
17

スパースインデックスを正しく理解できません。mongoのスパースインデックスとヌル値

私はFBID

{ 
    "ns" : "mydb.users", 
    "key" : { 
     "fbId" : 1 
    }, 
    "name" : "fbId_1", 
    "unique" : true, 
    "sparse" : true, 
    "background" : false, 
    "v" : 0 
} 

にまばらな一意のインデックスを持っていると私はそれが私がFBIDとしてnullを持つレコードを挿入することができるようになる期待していたが、それは重複キー例外をスローします。 fbIdプロパティが完全に削除された場合にのみ挿入することができます。

これを処理するスパースインデックスはありませんか?

答えて

31

スパースインデックスには、インデックス付きフィールドがないドキュメントは含まれません。ただし、フィールドが存在し、値がnullである場合、フィールドは引き続きインデックスされます。したがって、フィールドがなくなり、nullの値がアプリケーションに同じで、一意性を維持したい場合は、fbIdという値を持つまで挿入しないでください。

文書の数が多い場合は、疎のインデックスが必要ですが、その一部にはフィールドが含まれていて、そのフィールドで文書をすばやく検索したい場合があります。通常のインデックスを作成するには高価すぎるかもしれませんが、興味のないドキュメントをインデックスする際に貴重なRAMを無駄にするだけです。

1

インデックスを最大限に活用するには、フィールドを含まないドキュメントのインデックスを作成しないあなたがインデックスを実行している。このMongoDBの操作を行うには、次のように動作しますまばらな性質を持っています

db.addresses.ensureIndex({ "secondAddress": 1 }, { sparse: true }); 

このインデックスはsecondAddressフィールドを含まないすべての文書を省略し、クエリを実行するときに、それらの文書がスキャンされることはありません。 http://mongodbspain.com/en/2014/02/03/mongodb-indexes-part-2-geospatial-2d-2dsphere/

1

{a:1, b:5, c:2} 
{a:8, b:15, c:7} 
{a:4, b:7} 
{a:3, b:10} 

は、我々が作成したいと仮定しましょう:

地理空間、テキスト、ハッシュインデックスとユニークなとスパースプロパティ:

私はこの基本的なインデックスについての記事とそのプロパティの一部を共有しましょう上記の文書のインデックス。 a & bにインデックスを作成することは問題ありません。しかし、cにインデックスを作成する必要がある場合はどうすればよいでしょうか。 ヌル値が2つの文書に対してと重複しているため、一意制約はcキーでは機能しません。この場合の解決方法は、sparseオプションを使用することです。このオプションは、データベースにキーを逃した文書を含まないように指示します。問題のコマンドはdb.collectionName.createIndex({thing:1}, {unique:true, sparse:true})です。スパースインデックスは、より少ないスペースでも使用できます。

インデックスがsparseであっても、データベースはすべてのドキュメントをスキャンして、特に並べ替えを実行することに注意してください。これはの勝利プランのセクションexplainの結果で見ることができます。