21

スパース インデックスを正しく理解しているかどうかはわかりません。

fbId にスパース ユニーク インデックスがあります

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

そして、fbId として null のレコードを挿入できると期待していましたが、重複キーの例外がスローされます。fbId プロパティが完全に削除されている場合にのみ挿入できます。

まばらなインデックスはそれを処理するはずではありませんか?

4

3 に答える 3

40

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

多数のドキュメントがあり、それらのごく一部にしかフィールドが含まれておらず、そのフィールドでドキュメントをすばやく検索できるようにする場合は、スパース インデックスが必要です。通常のインデックスを作成するのはコストがかかりすぎます。興味のないドキュメントのインデックス作成に貴重な RAM を浪費するだけです。

于 2011-12-22T19:02:00.687 に答える
2

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

Let's assume that we wish to create an index on the above documents. Creating index on a & b will not be a problem. But what if we need to create an index on c. The unique constraint will not work for c keys because null value is duplicated for 2 documents. The solution in this case is to use sparse option. This option tells the database to not include the documents which misses the key. The command in concern is db.collectionName.createIndex({thing:1}, {unique:true, sparse:true}). The sparse index lets us use less space as well.

Notice that even if we have a sparse index, the database performs all documents scan especially when doing sort. This can be seen in the winning plan section of explain's result.

于 2016-09-03T17:34:41.813 に答える
2

インデックスの最大のパフォーマンスを確保するために、インデックスを実行しているフィールドを含まないドキュメントのインデックス作成を省略したい場合があります。これを行うために、MongoDB には次のように機能する sparse プロパティがあります。

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

このインデックスは、secondAddress フィールドを含まないすべてのドキュメントを除外し、クエリを実行すると、それらのドキュメントはスキャンされません。

基本的なインデックスとそのプロパティの一部に関するこの記事を共有させてください。

地理空間、テキスト、ハッシュ インデックス、および一意のスパース プロパティ: http://mongodbspain.com/en/2014/02/03/mongodb-indexes-part-2-geospatial-2d-2dsphere/

于 2014-02-10T00:26:59.460 に答える