English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

MongoDB 高度インデックス

以下のように名前のusersのコレクションにドキュメントを挿入しました。

db.users.insert(
	{
		"address": {
			"city": "Los Angeles"
			"state": "California"
			"pincode": ""123"
		},
		"tags": [
			"music",
			"cricket",
			"blogs"
		],
		"name": "Tom Benzamin"
	}
)

上記のドキュメントには、addressサブドキュメントとタグ配列が含まれています。

インデックス配列フィールド

ユーザーのタグに基づいてユーザー文書を検索する場合を想定します。そのため、コレクションのtags配列にインデックスを作成します。

配列上にインデックスを作成する場合、配列の各フィールドに対して個別のインデックス項目を作成します。したがって、私たちの例では、tags配列にインデックスを作成すると、値music、cricket、blogsに対して個別のインデックスが作成されます。

タグのtags配列にインデックスを作成するには、以下のコードを使用してください-

>db.users.createIndex({"tags":1}
{
"createdCollectionAutomatically": false
"numIndexesBefore": 2,
"numIndexesAfter": 3,
"ok": 1
}
>

インデックスを作成した後、コレクションのtagsフィールドで検索を行うことができます、例えば-

>db.users.find({tags:"cricket"}).pretty(){}
	"_id" : ObjectId("5dd7c927f1dd4583e7103fdf"),
	"address" : {
		"city" : "Los Angeles",
		"state" : "California",
		"pincode" : "123"
	},
	"tags" : [
		"music",
		"cricket",
		"blogs"
	],
	"name" : "Tom Benzamin"
}
>

正しいインデックスが使用されているか確認するには、以下の explain コマンドを使用してください-

>db.users.find({tags:"cricket"}).explain()

以下の結果が得られます-

{
	"queryPlanner": {
		"plannerVersion": 1,
		"namespace": "mydb.users"
		"indexFilterSet": false
		"parsedQuery": {}}
			"tags": {
				
			}
		},
		"queryHash": "",9D3B61A7,
		"planCacheKey": "049997B",
		
			"stage": "FETCH",
			
				"stage": "IXSCAN",
				"keyPattern": {
					"tags": 1
				},
				1,
				"isMultiKey": false,
				
					
				},
				
				
				"isPartial": false,
				 2,
				"direction": "forward",
				"indexBounds": {
					"tags" : [
						"[\"cricket\", \"cricket\"]"
					
				}
			}
		},
		"rejectedPlans": [],
	},
	"serverInfo": {
		"host": "Krishna",
		"port": 27017,
		"version": ""421,
		"gitVersion": "edf6d45851c0b9ee15548f0f847df141764a317e"
	},
	"ok": 1
}
>

上記のコマンドは「cursor」を生成しました:「BtreeCursor tags_1”,これは正しいインデックスが使用されていることを確認します。

サブドキュメントのインデックスフィールド

city、state、pincodeフィールドに基づいてドキュメントを検索する場合を想定します。これらのすべてのフィールドが住所のサブドキュメントの一部であるため、サブドキュメントのすべてのフィールドにインデックスを作成します。

サブドキュメントのすべての3つのフィールドにインデックスを作成するには、以下のコードを使用してください:-

>db.users.createIndex({"address.city":1,"address.state":1,"address.pincode":1}
{
	"numIndexesBefore": 4,
	"numIndexesAfter": 4,
	"note": "すべてのインデックスが既に存在します"
	"ok": 1
}
>

インデックスを作成した後、このインデックスを使ってどのサブドキュメントのフィールドでも検索することができます。以下のようになります:

> db.users.find({"address.city":"Los Angeles"}).pretty(){
	"_id" : ObjectId("5dd7c927f1dd4583e7103fdf"),
	"address" : {
		"city" : "Los Angeles",
		"state" : "California",
		"pincode" : "123"
	},
	"tags" : [
		"music",
		"cricket",
		"blogs"
	],
	"name" : "Tom Benzamin"
}

メモ:クエリ表現は指定されたインデックスの順序に従う必要があります。したがって、上記で作成されたインデックスは以下のクエリをサポートします-

>db.users.find({"address.city":"Los Angeles","address.state":"California"}).pretty(){
	"_id" : ObjectId("5dd7c927f1dd4583e7103fdf"),
	"address" : {
		"city" : "Los Angeles",
		"state" : "California",
		"pincode" : "123"
	},
	"tags" : [
		"music",
		"cricket",
		"blogs"
	],
	"name" : "Tom Benzamin"
}
>