MongoDBでユニークインデックスをスパースユニークインデックスに変更する方法
MongoDBでは、フィールドが存在しないドキュメントをインデックス対象から除外したい場合、「スパースインデックス(sparse index)」を使用します。スパースインデックスを作成するには、オプションに sparse: true を指定します。
ここでは、すでに作成済みの通常のユニークインデックスを、スパースなユニークインデックスへ変更する手順を解説します。MongoDBでは既存のインデックスの属性を直接書き換えることができないため、一度インデックスを削除(ドロップ)してから、再作成する必要があります。
1. 通常のユニークインデックスを作成する
まずは、比較用として通常のユニークインデックスを作成してみましょう。以下のクエリを実行します。
> db.demo229.ensureIndex({"ClientName":1}, {unique: true});
{
"createdCollectionAutomatically" : true,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}2. 作成されたインデックスを確認する
コレクションに設定されているインデックスの一覧は、getIndexes() メソッドで確認できます。
> db.demo229.getIndexes();
実行すると、次のような出力が得られます。「ClientName_1」インデックスには unique: true が設定されていますが、sparse の項目はまだありません。
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "test.demo229"
},
{
"v" : 2,
"unique" : true,
"key" : {
"ClientName" : 1
},
"name" : "ClientName_1",
"ns" : "test.demo229"
}
]3. インデックスを削除してスパースユニークインデックスとして再作成する
それでは、既存のインデックスを dropIndex() で削除し、sparse: true オプションを付けて再度作成しましょう。これにより、ユニークインデックスがスパースなユニークインデックスへと変わります。
> db.demo229.dropIndex("ClientName_1");
{ "nIndexesWas" : 2, "ok" : 1 }
> db.demo229.ensureIndex({"ClientName":1}, {unique: true, sparse:true});
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}4. 変更後のインデックスを確認する
もう一度 getIndexes() を実行して、結果を確認します。
> db.demo229.getIndexes();
出力を見ると、「ClientName_1」インデックスに "sparse" : true が追加されていることがわかります。これで、ClientName フィールドを持たないドキュメントはこのインデックスの対象外となり、null 値による重複エラーも回避できるようになります。
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "test.demo229"
},
{
"v" : 2,
"unique" : true,
"key" : {
"ClientName" : 1
},
"name" : "ClientName_1",
"ns" : "test.demo229",
"sparse" : true
}
]補足:ensureIndex() について
本記事の例では ensureIndex() を使用していますが、このメソッドは現在非推奨(deprecated)となっています。最新のMongoDB(バージョン4.0以降)では、代わりに createIndex() を使用することが推奨されています。構文や動作はほぼ同じなので、実際の開発では以下のように記述してください。
> db.demo229.createIndex({"ClientName":1}, {unique: true, sparse:true});
-
MongoDBのコレクションに一意インデックス(ユニークインデックス)を設定する方法
MongoDBでは、コレクション内の特定フィールドに重複した値が登録されないようにするために、一意インデックス(ユニークインデックス)を作成できます。インデックス作成時に unique: true を指定することで、そのフィールドに一意制約が適用されます。一意インデックスの作成手順まず、ドキュメントを格納するためのコレクションに対して、createIndex() メソッドを使って一意インデックスを作成します。あわせて sparse: true を指定すると、該当フィールドを持たないドキュメントはインデックスの対象外になります。> db.demo658.createIndex({First
-
MongoDBコレクションにインデックスを作成する方法
MongoDBコレクションにインデックスを作成する方法MongoDBでインデックスを作成するには、createIndex()メソッドを使用します。インデックスを適切に設定することで、クエリの検索速度を大幅に向上させることができます。まず、ドキュメントを含むコレクションに対してインデックスを作成してみましょう。以下の例では、details.idフィールドに対して昇順(1)のインデックスを作成しています。> db.demo702.createIndex({details.id:1});{ createdCollectionAutomatically : tr