阅读 160

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" : {				"$eq" : "cricket"
			}
		},		"queryHash" : "9D3B61A7",		"planCacheKey" : "04C9997B",		"winningPlan" : {			"stage" : "FETCH",			"inputStage" : {				"stage" : "IXSCAN",				"keyPattern" : {					"tags" : 1
				},				"indexName" : "tags_1",				"isMultiKey" : false,				"multiKeyPaths" : {					"tags" : [ ]
				},				"isUnique" : false,				"isSparse" : false,				"isPartial" : false,				"indexVersion" : 2,				"direction" : "forward",				"indexBounds" : {					"tags" : [						"[\"cricket\", \"cricket\"]"
					]
				}
			}
		},		"rejectedPlans" : [ ]
	},	"serverInfo" : {		"host" : "Krishna",		"port" : 27017,		"version" : "4.2.1",		"gitVersion" : "edf6d45851c0b9ee15548f0f847df141764a317e"
	},	"ok" : 1
}
>

上面的命令产生了“ cursor”:“ BtreeCursor tags_1”,它确认使用了正确的索引。

索引子文档字段

假设我们要根据city,state 和  pincode 字段搜索文档。由于所有这些字段都是地址子文档字段的一部分,因此我们将在子文档的所有字段上创建索引。

要在子文档的所有三个字段上创建索引,请使用以下代码-

>db.users.createIndex({"address.city":1,"address.state":1,"address.pincode":1})
{	"numIndexesBefore" : 4,	"numIndexesAfter" : 4,	"note" : "all indexes already exist",	"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"}
>


文章分类
代码人生
文章标签
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐