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"})
その他の拡張