MongoDB 上級インデックス
次のドキュメントコレクション(users)を考えます:
{
"address": {
"city": "Los Angeles",
"state": "California",
"pincode": "123"
},
"tags": [
"music",
"cricket",
"blogs"
],
"name": "Tom Benzamin"
}
上記のドキュメントには、address サブドキュメントと tags 配列が含まれています。
配列フィールドのインデックス化
タグに基づいてユーザーを検索するとします。そのためには、コレクション内の配列 tags にインデックスを作成する必要があります。
配列にインデックスを作成する場合、配列内の各フィールドに対して順にインデックスを作成する必要があります。したがって、配列 tags にインデックスを作成すると、music、cricket、blogs の3つの値に対して個別のインデックスが作成されます。
次のコマンドで配列インデックスを作成します:
>db.users.ensureIndex({"tags":1})
インデックス作成後、次のようにしてコレクションの tags フィールドを検索できます:
>db.users.find({tags:"cricket"})
インデックスを使用したことを確認するには、explain コマンドを使用します:
>db.users.find({tags:"cricket"}).explain()
上記のコマンド実行結果に "cursor" : "BtreeCursor tags_1" と表示されていれば、インデックスが使用されていることを示します。
サブドキュメントフィールドのインデックス化
city、state、pincode フィールドでドキュメントを検索する必要があるとします。これらのフィールドはサブドキュメントのフィールドであるため、サブドキュメントにインデックスを作成する必要があります。
サブドキュメントの3つのフィールドにインデックスを作成するコマンドは次のとおりです:
>db.users.ensureIndex({"address.city":1,"address.state":1,"address.pincode":1})
インデックスを作成すると、サブドキュメントのフィールドを使用してデータを検索できます:
>db.users.find({"address.city":"Los Angeles"})
クエリ式は指定されたインデックスの順序に従う必要はなく、MongoDB が自動的に最適化します。したがって、上記で作成したインデックスは次のクエリをサポートします:
>db.users.find({"address.state":"California","address.city":"Los Angeles"})
同様に、次のクエリもサポートします:
>db.users.find({"address.city":"Los Angeles","address.state":"California","address.pincode":"123"})
その他の拡張