溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

MongoDB索引類型怎么實現(xiàn)

發(fā)布時間:2022-04-11 10:09:36 來源:億速云 閱讀:147 作者:iii 欄目:開發(fā)技術(shù)

本文小編為大家詳細介紹“MongoDB索引類型怎么實現(xiàn)”,內(nèi)容詳細,步驟清晰,細節(jié)處理妥當,希望這篇“MongoDB索引類型怎么實現(xiàn)”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

    MongoDB 4.2官方支持索引類型如下:

    • 單字段索引

    • 復合索引

    • 多鍵索引

    • 文本索引

    • 2dsphere索引

    • 2d索引

    • geoHaystack索引

    • 哈希索引

    單字段索引

    在單個字段上創(chuàng)建升序索引

    handong1:PRIMARY> db.test.getIndexes()
    [
    	{
    		"v" : 2,
    		"key" : {
    			"_id" : 1
    		},
    		"name" : "_id_",
    		"ns" : "db6.test"
    	}
    ]

    在字段id上添加升序索引

    handong1:PRIMARY> db.test.createIndex({"id":1})
    {
    	"createdCollectionAutomatically" : false,
    	"numIndexesBefore" : 1,
    	"numIndexesAfter" : 2,
    	"ok" : 1,
    	"$clusterTime" : {
    		"clusterTime" : Timestamp(1621322378, 1),
    		"signature" : {
    			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
    			"keyId" : NumberLong(0)
    		}
    	},
    	"operationTime" : Timestamp(1621322378, 1)
    }
    handong1:PRIMARY> db.test.getIndexes()
    [
    	{
    		"v" : 2,
    		"key" : {
    			"_id" : 1
    		},
    		"name" : "_id_",
    		"ns" : "db6.test"
    	},
    	{
    		"v" : 2,
    		"key" : {
    			"id" : 1
    		},
    		"name" : "id_1",
    		"ns" : "db6.test"
    	}
    ]
    handong1:PRIMARY> db.test.find({"id":100})
    { "_id" : ObjectId("60a35d061f183b1d8f092114"), "id" : 100, "name" : "handong", "ziliao" : { "name" : "handong", "age" : 25, "hobby" : "mongodb" } }

    上述查詢可以使用新建的單字段索引。

    在嵌入式字段上創(chuàng)建索引

    handong1:PRIMARY> db.test.createIndex({"ziliao.name":1})
    {
    	"createdCollectionAutomatically" : false,
    	"numIndexesBefore" : 2,
    	"numIndexesAfter" : 3,
    	"ok" : 1,
    	"$clusterTime" : {
    		"clusterTime" : Timestamp(1621323677, 2),
    		"signature" : {
    			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
    			"keyId" : NumberLong(0)
    		}
    	},
    	"operationTime" : Timestamp(1621323677, 2)
    }

    以下查詢可以用的新建的索引。

    db.test.find({"ziliao.name":"handong"})

    在內(nèi)嵌文檔上創(chuàng)建索引

    handong1:PRIMARY> db.test.createIndex({ziliao:1})
    {
    	"createdCollectionAutomatically" : false,
    	"numIndexesBefore" : 3,
    	"numIndexesAfter" : 4,
    	"ok" : 1,
    	"$clusterTime" : {
    		"clusterTime" : Timestamp(1621324059, 2),
    		"signature" : {
    			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
    			"keyId" : NumberLong(0)
    		}
    	},
    	"operationTime" : Timestamp(1621324059, 2)
    }

    以下查詢可以使用新建的索引。

    db.test.find({ziliao:{ "name" : "handong", "age" : 25, "hobby" : "mongodb" }})

    復合索引

    創(chuàng)建復合索引

    db.user.createIndex({"product_id":1,"type":-1})

    以下查詢可以用到新建的復合索引

    db.user.find({"product_id":"e5a35cfc70364d2092b8f5d14b1a3217","type":0})

    多鍵索引

    基于一個數(shù)組創(chuàng)建索引,MongoDB會自動創(chuàng)建為多鍵索引,無需刻意指定。
    多鍵索引也可以基于內(nèi)嵌文檔來創(chuàng)建。
    多鍵索引的邊界值的計算依賴于特定的規(guī)則。
    查看文檔:

    handong1:PRIMARY> db.score.find()
    { "_id" : ObjectId("60a32d7f1f183b1d8f0920ad"), "name" : "dandan", "age" : 30, "score" : [ { "english" : 90, "math" : 99, "physics" : 88 } ], "is_del" : false }
    { "_id" : ObjectId("60a32d8b1f183b1d8f0920ae"), "name" : "dandan", "age" : 30, "score" : [ 99, 98, 97, 96 ], "is_del" : false }
    { "_id" : ObjectId("60a32d9a1f183b1d8f0920af"), "name" : "dandan", "age" : 30, "score" : [ 100, 100, 100, 100 ], "is_del" : false }
    { "_id" : ObjectId("60a32e8c1f183b1d8f0920b0"), "name" : "dandan", "age" : 30, "score" : [ { "english" : 70, "math" : 99, "physics" : 88 } ], "is_del" : false }
    { "_id" : ObjectId("60a37b141f183b1d8f0aa751"), "name" : "dandan", "age" : 30, "score" : [ 96, 95 ] }
    { "_id" : ObjectId("60a37b1d1f183b1d8f0aa752"), "name" : "dandan", "age" : 30, "score" : [ 96, 95, 94 ] }
    { "_id" : ObjectId("60a37b221f183b1d8f0aa753"), "name" : "dandan", "age" : 30, "score" : [ 96, 95, 94, 93 ] }

    創(chuàng)建score字段多鍵索引:

    db.score.createIndex("score":1)
    handong1:PRIMARY> db.score.find({"score":[ 96, 95 ]})
    { "_id" : ObjectId("60a37b141f183b1d8f0aa751"), "name" : "dandan", "age" : 30, "score" : [ 96, 95 ] }

    查看執(zhí)行計劃:

    handong1:PRIMARY> db.score.find({"score":[ 96, 95 ]}).explain()
    {
    	"queryPlanner" : {
    		"plannerVersion" : 1,
    		"namespace" : "db6.score",
    		"indexFilterSet" : false,
    		"parsedQuery" : {
    			"score" : {
    				"$eq" : [
    					96,
    					95
    				]
    			}
    		},
    		"queryHash" : "8D76FC59",
    		"planCacheKey" : "E2B03CA1",
    		"winningPlan" : {
    			"stage" : "FETCH",
    			"filter" : {
    				"score" : {
    					"$eq" : [
    						96,
    						95
    					]
    				}
    			},
    			"inputStage" : {
    				"stage" : "IXSCAN",
    				"keyPattern" : {
    					"score" : 1
    				},
    				"indexName" : "score_1",
    				"isMultiKey" : true,
    				"multiKeyPaths" : {
    					"score" : [
    						"score"
    					]
    				},
    				"isUnique" : false,
    				"isSparse" : false,
    				"isPartial" : false,
    				"indexVersion" : 2,
    				"direction" : "forward",
    				"indexBounds" : {
    					"score" : [
    						"[96.0, 96.0]",
    						"[[ 96.0, 95.0 ], [ 96.0, 95.0 ]]"
    					]
    				}
    			}
    		},
    		"rejectedPlans" : [ ]
    	},
    	"serverInfo" : {
    		"host" : "mongo3",
    		"port" : 27017,
    		"version" : "4.2.12",
    		"gitVersion" : "5593fd8e33b60c75802edab304e23998fa0ce8a5"
    	},
    	"ok" : 1,
    	"$clusterTime" : {
    		"clusterTime" : Timestamp(1621326912, 1),
    		"signature" : {
    			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
    			"keyId" : NumberLong(0)
    		}
    	},
    	"operationTime" : Timestamp(1621326912, 1)
    }

    可以看到已經(jīng)使用了新建的多鍵索引。

    文本索引

        為了支持對字符串內(nèi)容的文本搜索查詢,MongoDB提供了文本索引。文本(text )索引可以包含任何值為字符串或字符串元素數(shù)組的字段

    db.user.createIndex({"sku_attributes":"text"})
    db.user.find({$text:{$search:"測試"}})

    查看執(zhí)行計劃:

    handong1:PRIMARY> db.user.find({$text:{$search:"測試"}}).explain()
    {
    	"queryPlanner" : {
    		"plannerVersion" : 1,
    		"namespace" : "db6.user",
    		"indexFilterSet" : false,
    		"parsedQuery" : {
    			"$text" : {
    				"$search" : "測試",
    				"$language" : "english",
    				"$caseSensitive" : false,
    				"$diacriticSensitive" : false
    			}
    		},
    		"queryHash" : "83098EE1",
    		"planCacheKey" : "7E2D582B",
    		"winningPlan" : {
    			"stage" : "TEXT",
    			"indexPrefix" : {
    				
    			},
    			"indexName" : "sku_attributes_text",
    			"parsedTextQuery" : {
    				"terms" : [
    					"測試"
    				],
    				"negatedTerms" : [ ],
    				"phrases" : [ ],
    				"negatedPhrases" : [ ]
    			},
    			"textIndexVersion" : 3,
    			"inputStage" : {
    				"stage" : "TEXT_MATCH",
    				"inputStage" : {
    					"stage" : "FETCH",
    					"inputStage" : {
    						"stage" : "OR",
    						"inputStage" : {
    							"stage" : "IXSCAN",
    							"keyPattern" : {
    								"_fts" : "text",
    								"_ftsx" : 1
    							},
    							"indexName" : "sku_attributes_text",
    							"isMultiKey" : true,
    							"isUnique" : false,
    							"isSparse" : false,
    							"isPartial" : false,
    							"indexVersion" : 2,
    							"direction" : "backward",
    							"indexBounds" : {
    								
    							}
    						}
    					}
    				}
    			}
    		},
    		"rejectedPlans" : [ ]
    	},
    	"serverInfo" : {
    		"host" : "mongo3",
    		"port" : 27017,
    		"version" : "4.2.12",
    		"gitVersion" : "5593fd8e33b60c75802edab304e23998fa0ce8a5"
    	},
    	"ok" : 1,
    	"$clusterTime" : {
    		"clusterTime" : Timestamp(1621328543, 1),
    		"signature" : {
    			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
    			"keyId" : NumberLong(0)
    		}
    	},
    	"operationTime" : Timestamp(1621328543, 1)
    }

    可以看到通過文本索引可以查到包含測試關(guān)鍵字的數(shù)據(jù)。
    **注意:**可以根據(jù)自己需要創(chuàng)建復合文本索引。

    2dsphere索引

    創(chuàng)建測試數(shù)據(jù)

    db.places.insert(
       {
          loc : { type: "Point", coordinates: [ 116.291226, 39.981198 ] },
          name: "火器營橋",
          category : "火器營橋"
       }
    )
    
    
    db.places.insert(
       {
          loc : { type: "Point", coordinates: [ 116.281452, 39.914226 ] },
          name: "五棵松",
          category : "五棵松"
       }
    )
    
    db.places.insert(
       {
          loc : { type: "Point", coordinates: [ 116.378038, 39.851467 ] },
          name: "角門西",
          category : "角門西"
       }
    )
    
    
    db.places.insert(
       {
          loc : { type: "Point", coordinates: [ 116.467833, 39.881581 ] },
          name: "潘家園",
          category : "潘家園"
       }
    )
    
    db.places.insert(
       {
          loc : { type: "Point", coordinates: [ 116.468264, 39.914766 ] },
          name: "國貿(mào)",
          category : "國貿(mào)"
       }
    )
    
    db.places.insert(
       {
          loc : { type: "Point", coordinates: [ 116.46618, 39.960213 ] },
          name: "三元橋",
          category : "三元橋"
       }
    )
    
    db.places.insert(
       {
          loc : { type: "Point", coordinates: [ 116.400064, 40.007827 ] },
          name: "奧林匹克森林公園",
          category : "奧林匹克森林公園"
       }
    )

    添加2dsphere索引

    db.places.createIndex( { loc : "2dsphere" } )
    db.places.createIndex( { loc : "2dsphere" , category : -1, name: 1 } )

    利用2dsphere索引查詢多邊形里的點

    鳳凰嶺
    [116.098234,40.110569]
    天安門
    [116.405239,39.913839]
    四惠橋
    [116.494351,39.912068]
    望京
    [116.494494,40.004594]

    handong1:PRIMARY> db.places.find( { loc :
    ...                   { $geoWithin :
    ...                     { $geometry :
    ...                       { type : "Polygon" ,
    ...                         coordinates : [ [
    ...                                           [116.098234,40.110569] ,
    ...                                           [116.405239,39.913839] ,
    ...                                           [116.494351,39.912068] ,
    ...                                           [116.494494,40.004594] ,
    ...                                           [116.098234,40.110569]
    ...                                         ] ]
    ...                 } } } } )
    { "_id" : ObjectId("60a4c950d4211a77d22bf7f8"), "loc" : { "type" : "Point", "coordinates" : [ 116.400064, 40.007827 ] }, "name" : "奧林匹克森林公園", "category" : "奧林匹克森林公園" }
    { "_id" : ObjectId("60a4c94fd4211a77d22bf7f7"), "loc" : { "type" : "Point", "coordinates" : [ 116.46618, 39.960213 ] }, "name" : "三元橋", "category" : "三元橋" }
    { "_id" : ObjectId("60a4c94fd4211a77d22bf7f6"), "loc" : { "type" : "Point", "coordinates" : [ 116.468264, 39.914766 ] }, "name" : "國貿(mào)", "category" : "國貿(mào)" }

    可以看到把集合中包含在指定四邊形里的點,全部列了出來。

    利用2dsphere索引查詢球體上定義的圓內(nèi)的點

    handong1:PRIMARY> db.places.find( { loc :
    ...                   { $geoWithin :
    ...                     { $centerSphere :
    ...                        [ [ 116.439518, 39.954751 ] , 2/3963.2 ]
    ...                 } } } )
    { "_id" : ObjectId("60a4c94fd4211a77d22bf7f7"), "loc" : { "type" : "Point", "coordinates" : [ 116.46618, 39.960213 ] }, "name" : "三元橋", "category" : "三元橋" }

    返回所有半徑為經(jīng)度 116.439518 E 和緯度 39.954751 N 的2英里內(nèi)坐標。示例將2英里的距離轉(zhuǎn)換為弧度,通過除以地球近似的赤道半徑3963.2英里。

    2d索引

    在以下情況下使用2d索引:

    • 您的數(shù)據(jù)庫具有來自MongoDB 2.2或更早版本的舊版舊版坐標對。

    • 您不打算將任何位置數(shù)據(jù)存儲為GeoJSON對象。

    哈希索引

    要創(chuàng)建hashed索引,請指定 hashed 作為索引鍵的值,如下例所示:

    handong1:PRIMARY> db.test.createIndex({"_id":"hashed"})
    {
    	"createdCollectionAutomatically" : false,
    	"numIndexesBefore" : 4,
    	"numIndexesAfter" : 5,
    	"ok" : 1,
    	"$clusterTime" : {
    		"clusterTime" : Timestamp(1621419338, 1),
    		"signature" : {
    			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
    			"keyId" : NumberLong(0)
    		}
    	},
    	"operationTime" : Timestamp(1621419338, 1)
    }

    注意事項

    • MongoDB支持任何單個字段的 hashed 索引。hashing函數(shù)折疊嵌入的文檔并計算整個值的hash值,但不支持多鍵(即.數(shù)組)索引。

    • 您不能創(chuàng)建具有hashed索引字段的復合索引,也不能在索引上指定唯一約束hashed;但是,您可以hashed在同一字段上創(chuàng)建索引和升序/降序(即非哈希)索引:MongoDB將對范圍查詢使用標量索引。

    讀到這里,這篇“MongoDB索引類型怎么實現(xiàn)”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領(lǐng)會,如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

    向AI問一下細節(jié)

    免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI