【收藏】MyBatis 常用語法匯總
697
2025-04-01
MongoDB 索引
如果集合中存在許多文檔, 通常創(chuàng)建索引 來存儲文檔中的一個或多個特點字段進(jìn)行排序存儲, 這樣查詢效率會很高
MongoDB中的索引類型
索引類型
描述
舉例
單字段索引
在某一個特定的字段上建立索引 mongoDB在ID上建立了唯一的單鍵索引,所以經(jīng)常會使用id來進(jìn)行查詢; 在索引字段上進(jìn)行精確匹配、排序以及范圍查找都會使用此索引;
db.users. createIndex({age:- 1});
復(fù)合索引
在多個特定的屬性上建立索引 復(fù)合索引鍵的排序順序,可以確定該索引是否可以支持排序操作; 在索引字段上進(jìn)行精確匹配、排序以及范圍查找都會使用此索引,但與索引的順序 有關(guān); 為了性能考慮,應(yīng)刪除存在與第一個鍵相同的單鍵索引
db.users. createIndex({username:1,age: -1,country:1})
多鍵索引
在數(shù)組的屬性上建立索引 針對這個數(shù)組的任意值的查詢都會定位到這個文檔,既多個索引入口或者鍵值引用 同一個文檔
db.users. createIndex({favorites.city: 1})
空間索引
2種平面幾何的2d索引,球面幾何的2dsphere索引 見后文詳解 文本索引 支持在集合中搜索字符串內(nèi)容
db.reviews.createIndex( { co mments: "text" } )
Hash索引
不同于傳統(tǒng)的B-樹索引,哈希索引使用hash函數(shù)來創(chuàng)建索引 在索引字段上進(jìn)行精確匹配,但不支持范圍查詢,不支持多鍵hash; Hash索引上的入口是均勻分布的,在分片集合中非常有用;
db.users. createIndex({username : 'hashed'})
1 創(chuàng)建單字段索引
語法 db.collection.createindex(
唯一索引 db.collection.createIndex({id:1},{unique:true}) #默認(rèn)在_id 上創(chuàng)建唯一索引 部分索引 僅索引集合中符合指定過濾器表達(dá)式的文檔。較低的存儲需求,索引創(chuàng)建和維護(hù)的成本變小。 db.restaurants.createIndex({ cuisine: 1, name: 1 }, {partialFilterExpression:{ rating:{$gt: 5}}}) 稀疏索引 僅索引包含具有索引字段的文檔,哪怕索引字段包含空值 db.addresses.createIndex( { "xmpp_id": 1 }, { sparse: true } )
TLL索引 (time-to-live) 特殊的單字段索引,針對時間類型的字段, 在一定時間后或在特定時間自動從集合中刪除文檔。對于日志和會話類的信息很有用。 db.eventlog.createIndex( {"lastModifiedDate":1}, {expireAfterSeconds:3600 }) db.eventlog.createIndex( {"lastModifiedDate":1}, {expireAfterSeconds: 60*60*24*7 }) #單位秒 s 特點 TTL索引不可以是復(fù)合索引 如果索引字段不是時間類型, 文檔不會刪除 TTL 每60s運行一次,移除過期文檔 如果時間類型字段已經(jīng)被定義為其它索引, 則無法通過TTL 索引來刪除此文檔 db.eventlog.drop(); db.eventlog.insert([ {system:"trade", lastModifiedDate:ISODate("2017-11-12T20:20:13Z"), context:"NullPointException, "}, {system:"goods", lastModifiedDate:ISODate("2017-11-15T20:21:13Z"), context:"NullPointException, "}, {system:"mongodb", lastModifiedDate:ISODate("2017-11-16T20:22:13Z"), context:"2019-11-12 18:18:52.426 [main] DEBUG org.mongodb.driver.connection - Closing connection connectionId{localValue:2, serverValue:2409}"} ]); // TLL 索引,創(chuàng)建索引的字段是日期或者是日期數(shù)組。不是這種類型的字段,是不會刪除文檔的, // 30秒后過期,會話、日志 db.eventlog.createIndex({"lastModifiedDate":1}, {expireAfterSeconds:30}); db.eventlog.find(); 不區(qū)分大小寫 #strength db.fruit.createIndex({ type: 1},{collation:{ locale:'en', strength:2 } } )
全文本索引 用于查詢MongoDB中的文本文檔,可以包含一個或多個字段; 建立索引時需要將字段指定為 文本索引 “text”, 查詢搭配 $text操作符 特點 一個集合最多只能創(chuàng)建一個全文本索引,寫入速度會變慢 全文本索引可選擇所有字符串類型的字段, 可用全字段或者指定字段創(chuàng)建 可設(shè)置權(quán)重 全文本索引暫不支持中文索引 例 #部分字段 db.product.createindex({“productName”:”text”, “productStatus”: “text”}) #將product 集合中所有字符串的字段創(chuàng)建成全文本索引, 用”$**”代表文檔中所有字符串類型 db.product.createindex( {“$**” : “text”} ) # 創(chuàng)建文本索引搭配權(quán)重值 db.product.createindex( {“$**” : “text”} , {“weights”: {“ProductName” :10, “ProductMode”:5 } } ) # 使用$text 操作符 查詢含有 rose文檔 db.product.find({$text:{$search: “rose”}}).pretty()
地理空間索引 兩類地理空間索引: 1) 2dsphere 2) 2d 2dsphere 支持查詢球體上位置,支持 GeoJSON 和傳統(tǒng)坐標(biāo)類型的數(shù)據(jù) GeoJSON數(shù)據(jù) 需要使用簽入文檔, 通過coordinate字段來指定坐標(biāo)位置, 通過type來指定坐標(biāo)類型, type分為如下三類 1 點 point 若type為point, coordinates 字段只有一個坐標(biāo) 2 線 lineString , 若type為lineString, coordinates 字段有兩個坐標(biāo) 3 多邊形 Polygon, 若type為Polygon 則coordinates 會有兩個以上坐標(biāo) // 球體空間 db.places.drop(); db.places.insert([ { loc:{ type:"Point", coordinates:[ -73.97, 40.77 ] }, name:"Central Park", category:"Parks" }, { loc:{ type:"Point", coordinates:[ -73.88, 40.78 ] }, name:"La Guardia Airport", category:"Airport" } ]); // 創(chuàng)建球體空間索引 db.places.createIndex( { loc:"2dsphere" } ) // 創(chuàng)建空間索引的復(fù)合索引 db.places.createIndex( { loc:"2dsphere" , category:-1, name:1 } ) // 聚合使用,距指定點最近到最遠(yuǎn)的順序輸出文檔 db.places.aggregate([ { $geoNear: { near: { type: "Point", coordinates: [ -73.99279 , 40.719296 ] }, distanceField: "dist.calculated", # 該參數(shù)用于計算只讀坐標(biāo)文檔與文檔中坐標(biāo)之間的距離 key: “l(fā)oc” # 指定 loc 字段上的2dsphere 索引 minDistance: 2, query: { category: "Parks" }, includeLocs: "dist.location", spherical: true } } ]) 傳統(tǒng)坐標(biāo)數(shù)據(jù): 只需要一個字段來指定坐標(biāo)位置 2d 此索引類型支持查詢二維平面位置,僅支持傳統(tǒng)坐標(biāo)類型的數(shù)據(jù) db.location.insert([ { _id:100, pos:{lng:126.9, lat:35.2}, co:[126.9, 35.2], type:"restaurant"}, { _id:200, pos:{lng:127.5, lat:36.1}, co:[127.5, 36.1], type:"restaurant"}, { _id:300, pos:{lng:128.0, lat:36.7}, co:[128.0, 36.7], type:"national park"} ]) // 創(chuàng)建2d索引 db.location.createIndex({co:"2d"}) db.places.aggregate([ { $geoNear: { near:[126,30] distanceField: "dist.location", key: “co” # 指定 co 字段上的2d索引 } } ]) // 查詢離目標(biāo)點(-70,30)距離最近的10個點 db.location.find({"co":{$near:[-70,30]}}).limit(10); // $within 參數(shù)可以代替$near來查找一個形狀之內(nèi)結(jié)果, // 必須指定該矩形的左下角和右上角坐標(biāo) // 還可以支持$box(矩形)和$center(圓環(huán))的范圍查詢 var box = [[10,10], [140,40]]; db.location.find({"co":{$within:{"$box":box}}}) // 創(chuàng)建geoHaystack索引 db.location.createIndex({pos:"geoHaystack", type:1} , {bucketSize:1}) // 查詢需要使用geoSearch關(guān)鍵字指定集合,查詢附近10米范圍的餐館 // Haystack索引不適合查詢最接近特定位置的文檔的完整列表。與存儲桶大小相比,最接近的文檔可能會更遠(yuǎn)。 // find方法無法使用geoHaystack索引,需要使用db.rumCommand方法 db.runCommand( {geoSearch:"location", search:{ type:"restaurant" } , near:[127, 36.8], maxDistance:1} ) // 首選通過find方法查詢,也可以通過db.runCommand方式查詢。 // 這種方式返回的結(jié)果中,包含距離目標(biāo)點的距離和一些利于排除故障的信息 db.runCommand({ geoSearch:"location", near:[126,30], maxDistance:16, search:{type:"restaurant"}, imit:10 });
2 重建索引
索引出現(xiàn)損壞,可以用reindex()方法重建索引, 本質(zhì)是將索引刪除后重建, 對于副本集來說,索引重建只會在當(dāng)前mongod進(jìn)行,不會同步給其它節(jié)點 不推薦使用 db.collection.reindex()
3 查詢索引 getindexes()? & totalindexsize()
查看索引 db.collection.getindexes() 查看集合中所有索引的大小 db.collection.totalindexSize()
4 刪除索引 dropindex()
# db.collection.dropindex
MongoDB
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。