サーチ…


構文

  • 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フィールドまたはnameageクエリで索引を使用できますが、 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 }を作成している間は、インデックスはascendingdescending -1を意味します。

2.4

ハッシュされたインデックス

インデックスは、 ハッシュとしても定義できます。これは、 等価クエリでよりパフォーマンスが向上しますが範囲クエリでは効率的ではありません。ただし、同じフィールドにハッシュされたインデックスと昇順/降順の両方のインデックスを定義できます。

> 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オプションの両方を同時に指定することはできません。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow