MongoDB
インデックス
サーチ…
構文
db.collection.createIndex({ <string field> : <1|-1 order> [, <string field> : <1|-1 order>] });
備考
パフォーマンスへの影響 :インデックスは読み取りパフォーマンスを向上させますが、文書を挿入するにはすべてのインデックスを更新する必要があるため、書き込みパフォーマンスに悪影響を与える可能性があることに注意してください。
単一フィールド
db.people.createIndex({name: 1})
これにより、フィールド名に昇順単一フィールド索引が作成されます。
このタイプのインデックスでは、mongoがインデックスを両方向にトラバースできるので、ソート順は関係ありません。
化合物
db.people.createIndex({name: 1, age: -1})
これにより、複数のフィールド(この場合はname
フィールドとage
フィールド)にインデックスが作成されます。それはname
昇順とage
降順になります。
このタイプの索引では、索引がソート操作をサポートできるかどうかを判別するため、ソート順は関係します。逆ソートは、ソート内のすべてのキーに対してソートが逆ソート方向にある限り、複合インデックスの任意の接頭辞でサポートされます。それ以外の場合、複合インデックスのソートはインデックスの順序と一致する必要があります。
フィールドの順序も重要です。この場合、インデックスは最初にname
でソートされ、各名前値内ではage
フィールドの値でソートされます。これにより、 name
フィールドまたはname
とage
クエリで索引を使用できますが、 age
のみでは使用できません。
削除
インデックスを削除するには、インデックス名
db.people.dropIndex("nameIndex")
または、索引指定文書
db.people.dropIndex({name: 1})
リスト
db.people.getIndexes()
これは、 peopleコレクションのインデックスを記述する一連のドキュメントを返します
インデックス作成の基礎
以下のトランザクションコレクションを参照してください。
> db.transactions.insert({ cr_dr : "D", amount : 100, fee : 2});
> db.transactions.insert({ cr_dr : "C", amount : 100, fee : 2});
> db.transactions.insert({ cr_dr : "C", amount : 10, fee : 2});
> db.transactions.insert({ cr_dr : "D", amount : 100, fee : 4});
> db.transactions.insert({ cr_dr : "D", amount : 10, fee : 2});
> db.transactions.insert({ cr_dr : "C", amount : 10, fee : 4});
> db.transactions.insert({ cr_dr : "D", amount : 100, fee : 2});
getIndexes()
関数は、コレクションで使用可能なすべてのインデックスを表示します。
db.transactions.getIndexes();
上記の声明の出力を見てみましょう。
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "documentation_db.transactions"
}
]
トランザクション収集にはすでに1つのインデックスがあります。これは、MongoDBがコレクションの作成中に_id
フィールドに一意のインデックスを作成するためです。 _id
インデックスは、クライアントが_id
フィールドに同じ値を持つ2つのドキュメントを挿入できないようにします。このインデックスを_id
フィールドにドロップすることはできません。
cr_drフィールドのインデックスを追加しましょう。
db.transactions.createIndex({ cr_dr : 1 });
索引の実行結果は次のとおりです。
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
createdCollectionは、操作によってコレクションが作成されたかどうかを自動的に示します。コレクションが存在しない場合、MongoDBはインデックス作成操作の一部としてコレクションを作成します。
db.transactions.getIndexes();
実行しdb.transactions.getIndexes();
再び。
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "documentation_db.transactions"
},
{
"v" : 1,
"key" : {
"cr_dr" : 1
},
"name" : "cr_dr_1",
"ns" : "documentation_db.transactions"
}
]
トランザクションコレクションに2つのインデックスがあることがわかりました。私たちが作成したデフォルトの_id
インデックスとcr_dr_1
。名前はMongoDBによって割り当てられます。自分の名前を以下のように設定することができます。
db.transactions.createIndex({ cr_dr : -1 },{name : "index on cr_dr desc"})
今すぐdb.transactions.getIndexes();
あなたに3つの指標を与えるでしょう。
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "documentation_db.transactions"
},
{
"v" : 1,
"key" : {
"cr_dr" : 1
},
"name" : "cr_dr_1",
"ns" : "documentation_db.transactions"
},
{
"v" : 1,
"key" : {
"cr_dr" : -1
},
"name" : "index on cr_dr desc",
"ns" : "documentation_db.transactions"
}
]
インデックス{ cr_dr : -1 }
を作成している間は、インデックスはascending
、 descending
-1を意味します。
ハッシュされたインデックス
インデックスは、 ハッシュとしても定義できます。これは、 等価クエリでよりパフォーマンスが向上しますが 、 範囲クエリでは効率的ではありません。ただし、同じフィールドにハッシュされたインデックスと昇順/降順の両方のインデックスを定義できます。
> db.transactions.createIndex({ cr_dr : "hashed" });
> db.transactions.getIndexes(
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "documentation_db.transactions"
},
{
"v" : 1,
"key" : {
"cr_dr" : "hashed"
},
"name" : "cr_dr_hashed",
"ns" : "documentation_db.transactions"
}
]
インデックスの削除/削除
インデックス名がわかっている場合は、
db.collection.dropIndex('name_of_index');
インデックス名がわからない場合は、
db.collection.dropIndex( { 'name_of_field' : -1 } );
コレクションのインデックスを取得する
db.collection.getIndexes();
出力
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "documentation_db.transactions"
},
{
"v" : 1,
"key" : {
"cr_dr" : 1
},
"name" : "cr_dr_1",
"ns" : "documentation_db.transactions"
},
{
"v" : 1,
"key" : {
"cr_dr" : -1
},
"name" : "index on cr_dr desc",
"ns" : "documentation_db.transactions"
}
]
ユニークなインデックス
db.collection.createIndex( { "user_id": 1 }, { unique: true } )
定義されたインデックス(単一または複合)の一意性を強制します。コレクションにすでに重複した値が含まれている場合、索引の作成は失敗します。 sparse: true
が指定されていない限り、複数の項目がフィールドを欠いている場合でも索引付けは失敗します(これらはすべて値null
索引付けされるため)。
スパースインデックスと部分インデックス
スパースインデックス:
これらは、オプションであるが一意でなければならないフィールドに特に便利です。
{ "_id" : "[email protected]", "nickname" : "Johnnie" }
{ "_id" : "[email protected]" }
{ "_id" : "[email protected]", "nickname" : "Jules"}
{ "_id" : "[email protected]" }
2つのエントリにはニックネームが指定されておらず、インデックスは未指定のフィールドをnullとして扱いますので、インデックス作成は失敗し、2つのドキュメントが 'null'
db.scores.createIndex( { nickname: 1 } , { unique: true, sparse: true } )
あなたはまだ 'ヌル'ニックネームを持つことができます。
スパースインデックスは、そのフィールドを指定していないドキュメントをスキップ/無視するため、よりコンパクトです。したがって、文書の10%未満しかこのフィールドを指定していないコレクションを持っている場合は、より小さなインデックスを作成することができます。たとえば以下のようなクエリを実行する場合は、
db.scores.find({'nickname': 'Johnnie'})
部分インデックス:
部分インデックスは、疎インデックスによって提供される機能のスーパーセットを表し、疎インデックスよりも優先される必要があります。 ( バージョン3.2の新機能 )
部分インデックスは、指定されたフィルタに基づいてインデックスエントリを決定します。
db.restaurants.createIndex(
{ cuisine: 1 },
{ partialFilterExpression: { rating: { $gt: 5 } } }
)
rating
が5より大きい場合、 cuisine
インデックスが作成されます。はい、他のプロパティの値に基づいてインデックスを付けるプロパティを指定することもできます。
スパースインデックスと部分インデックスの違い:
疎索引は、索引付けされたフィールドの存在のみに基づいて索引を付ける文書を選択するか、複合索引の場合は索引付けされたフィールドの存在を選択します。
部分インデックスは、指定されたフィルタに基づいてインデックスエントリを決定します。フィルターには索引キー以外のフィールドを含めることができ、単に存在チェック以外の条件を指定することができます。
それでも、部分インデックスは、疎インデックスと同じ動作を実装できます
例えば:
db.contacts.createIndex(
{ name: 1 },
{ partialFilterExpression: { name: { $exists: true } } }
)
注: partialFilterExpressionオプションとsparseオプションの両方を同時に指定することはできません。