2

MongoDB のマニュアルによると、スパース インデックスには、そのフィールドを含むオブジェクトのみが含まれます。スパース インデックスのサイズをバイト単位で確認できますが、含まれるオブジェクトの数を調べるにはどうすればよいですか? オブジェクトのアップグレードを行っていますが、その数は処理が残っている数です。

更新: 私のインデックス フィールドは Integer と ObjectId です。インデックスに固定サイズがある場合、そのサイズのバイト数を各インデックス サイズで割って近似値を取得できますか? そのフィールドを持つオブジェクトを削除しても、スパース インデックスのサイズがディスク上で縮小されない可能性があります...

4

1 に答える 1

1

それぞれのフィールドが設定されている場合、オブジェクトはスパースインデックスに含まれますnull。したがって、を使用$existsして、値が設定されている要素の数を取得できます。

> db.Foo.count();
185
> db.Foo.find({"SparseField" : {$exists : true} }).count();
174

したがって、11個のドキュメントのみがスパースインデックスに含まれていません。または、を使用hintして、スパースインデックスを使用するクエリを強制し、を使用explainしていくつかの統計を取得することもできます。

> db.Foo.find().hint("sparse_index_name").explain();
{
    "cursor" : "BtreeCursor sparse_index_name",
    "n" : 174,
}

を使用したCAVEATクエリexplain()は、explainを使用しないクエリとは異なる動作をします。具体的にdb.Foo.find().hint("sparse_index_name").count()は、174ではなく185を返します。


スパースインデックスが正しく使用されているかどうかを時々チェックすることは理にかなっています。

> db.Foo.find({"SparseField" : null }).count();
38

おっと。これらの38のドキュメントは、おそらく意図的にではなく、インデックスが付けられています。

于 2013-01-10T10:06:11.173 に答える