我們在名為users的集合中插入了以下文檔,如下所示–
db.users.insert( { "address": { "city": "Los Angeles", "state": "California", "pincode": "123" }, "tags": [ "music", "cricket", "blogs" ], "name": "Tom Benzamin" } )
上面的文檔包含一個address子文檔和一個標(biāo)記數(shù)組。
假設(shè)我們要根據(jù)用戶的標(biāo)記搜索用戶文檔。為此,我們將在集合中的tags數(shù)組上創(chuàng)建一個索引。
在數(shù)組上創(chuàng)建索引,依次為數(shù)組的每個字段創(chuàng)建單獨的索引項。所以在我們的實例中,當(dāng)我們在tags數(shù)組上創(chuàng)建索引時,將為其值music、cricket和blogs創(chuàng)建單獨的索引。
要在標(biāo)簽tags數(shù)組上創(chuàng)建索引,請使用以下代碼-
>db.users.createIndex({"tags":1}) { "createdCollectionAutomatically" : false, "numIndexesBefore" : 2, "numIndexesAfter" : 3, "ok" : 1 } >
創(chuàng)建索引之后,我們可以在集合的 tags 字段上進(jìn)行搜索,如下-
> 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()
這給您以下結(jié)果-
{ "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 } >
上面的命令產(chǎn)生了“ cursor”:“ BtreeCursor tags_1”,它確認(rèn)使用了正確的索引。
假設(shè)我們要根據(jù)city,state 和 pincode 字段搜索文檔。由于所有這些字段都是地址子文檔字段的一部分,因此我們將在子文檔的所有字段上創(chuàng)建索引。
要在子文檔的所有三個字段上創(chuàng)建索引,請使用以下代碼-
>db.users.createIndex({"address.city":1,"address.state":1,"address.pincode":1}) { "numIndexesBefore" : 4, "numIndexesAfter" : 4, "note" : "all indexes already exist", "ok" : 1 } >
創(chuàng)建索引后,我們可以使用此索引搜索任何子文檔字段,如下所示:
> 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" }
請記住,查詢表達(dá)式必須遵循指定索引的順序。因此,上面創(chuàng)建的索引將支持以下查詢-
>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" } >