亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > MongoDB > 正文

MongoDB通配符索引的用法實例

2020-10-29 18:40:08
字體:
來源:轉載
供稿:網友

指南

MongoDB在4.2 版本推出了Wildcard Indexes,究竟什么是Wildcard Indexes以及Wildcard Indexes適合哪些場景本文結合官方文檔以及實際測試進行簡單概述。

1、通配符索引示例

因為MongoDB是dynamic schemas,所以應用是可以查詢任何已知字段或者隨機字段的。

假設(此假設案例摘自官方文檔),集合colA的UserMetadata字段包含如下數據:

{ "userMetadata" : { "likes" : [ "dogs", "cats" ] } }{ "userMetadata" : { "dislikes" : "pickles" } }{ "userMetadata" : { "age" : 45 } }{ "userMetadata" : "inactive" }

但是在查詢的時候可能是如下語句:

db.colA.find({ "userMeta2通配符索引的形式data.likes" : "dogs" })db.colA.find({ "userMetadata.dislikes" : "pickles" })db.colA.find({ "userMetadata.age" : { $gt : 30 } })db.colA.find({ "userMetadata" : "inactive" })

是否能通過一個索引來完成上述需求?

答案是肯定的,上述查詢可以通過通配符索引來實現既定需求,也就是 db.colA.createIndex( { "userMetadata.$**" : 1 } )。

那么如何創建通配符索引?

注意:首先應該明確的是通配符索引只在版本兼容性4.2的時候才能創建。

如何查詢版本兼容性?

db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } )

如何設置?

db.adminCommand( { setFeatureCompatibilityVersion: "4.2" } )

2、通配符索引的形式

單字段通配符索引

{ "_id" : ObjectId("5ee2df16911d8dfaa91520b4"), "product_name" : "Spy Coat", "product_attributes" : { "material" : [ "Tweed", "Wool", "Leather" ], "size" : { "length" : 72, "units" : "inches" } }}{ "_id" : ObjectId("5ee2df30911d8dfaa91520b5"), "product_name" : "Spy Pen", "product_attributes" : { "colors" : [ "Blue", "Black" ], "secret_feature" : { "name" : "laser", "power" : "1000", "units" : "watts" } }}

如果數據結構是上面這樣的,其中product_attributes 屬性包含任何的結構。

那么如果我們創建一個這個索引,它會進行什么操作?

db.product_catalog.createIndex({"product_attributes.$**":1})。

因為product_attributes 里面包含數組和嵌套文檔等對象,實際創建這個索引后,會迭代嵌套文檔或者數組把里面的所有的值都取出來放到索引里。支持如下查詢:

db.product_catalog.find({"product_attributes.colors":"Blue"})db.product_catalog.find({"product_attributes.secret_feature.name":"laser"})db.product_catalog.find({"product_attributes.size.length":{$gt:60}})

全字段的通配符索引

可以通過下面的語句創建一個索引,索引中包含集合中的所有字段,但是不包括_id(如果想包含_id可以通過wildcardProjection 來設置),如果集合中的字段包含數組或者嵌套對象的話,那么會迭代數組或者嵌套對象并把值放到索引中。

Db.product_catalog.createIndex({“$**”:1}) 

給每個文檔添加一個address的字段。

7777:PRIMARY> db.product_catalog.find().pretty(){ "_id" : ObjectId("5ee2df16911d8dfaa91520b4"), "product_name" : "Spy Coat", "product_attributes" : { "material" : [ "Tweed", "Wool", "Leather" ], "size" : { "length" : 72, "units" : "inches" } }, "address" : "Beijing"}{ "_id" : ObjectId("5ee2df30911d8dfaa91520b5"), "product_name" : "Spy Pen", "product_attributes" : { "colors" : [ "Blue", "Black" ], "secret_feature" : { "name" : "laser", "power" : "1000", "units" : "watts" } }, "address" : "Tianjin"}db.product_catalog.find({"product_name":"Spy Coat","address":"nanji","product_attributes.colors":"Blue"})

在全字段通配符索引的基礎上可以明確包含哪些或者不包含哪些字段到通配符索引中,只能是在全字段通配符索引的基礎上,單字段的是不可以的:

在全字段的基礎上創建一個明確包含哪些字段的索引:

db.collection.createIndex( { "$**" : 1 }, { "wildcardProjection" : { "fieldA" : 1, "fieldB.fieldC" : 1 } })

注意:通配符索引不支持在使用wildcardProjection的時候混合使用包含和排除語句,除了明確指定包含_id字段的時候。

在全字段的基礎上創建一個明確不包含哪些字段的索引:

db.collection.createIndex( { "$**" : 1 }, { "wildcardProjection" : { "fieldA" : 0, "fieldB.fieldC" : 0 } })

3、通配符索引的行為

通配符索引的行為根據其字段類型不同而有所不同。

  • 字段為對象
    如果是對象的話,會將對象中的內容存儲到索引中,通配符索引會把對象中的所有嵌套對象加載到索引中。
  • 字段為數組
    如果是數組的話,通配符索引遍歷數組并且將每個元素都存儲到索引中。
    如果數組中的元素是一個對象的話,通配符索引把對象中的內容加載到索引中,像上面的加載對象一樣。
    如果數組中的元素是一個數組的話(就是多維數組),通配符索引并不迭代嵌套數組,相反是把整個嵌套數組作為一個值來看。
  • 其他類型
    把值記錄到數組中。
    通配符索引會持續迭代任何的嵌套對象或者數組直到最底層(就是不能在迭代為止),然后它會索引全路徑。

通配符索引對于顯示數組位置的查詢

通配符索引雖然不會記錄給定數組中的元素下標,但是,MongoDB仍然可以選擇通配符索引來滿足包含一個或多個顯式數組索引的字段路徑的查詢(for example, parentArray.0.nestedArray.0)

由于為每個連續嵌套數組定義索引邊界的復雜性日益增加,如果該路徑包含8個以上的顯式數組索引,MongoDB不會考慮使用通配符索引來回答查詢中的給定字段路徑。MongoDB仍然可以考慮使用通配符索引來回答查詢中的其他字段路徑。

如果超過了8個以上顯示數組索引的話MongoDB 會考慮另外的索引或者執行全集合掃描。如下結構:

{ "parentObject" : { "nestedArray" : [ "elementOne", {  "deeplyNestedArray" : [ "elementTwo" ] } ] }}

請注意,通配符索引本身對索引文檔時遍歷文檔的深度沒有任何限制;該限制僅適用于顯式指定精確數組索引的查詢。通過發出沒有顯式數組索引的相同查詢,MongoDB可以選擇通配符索引來回答查詢。

4、通配符索引的限制

1.首先通配符索引是一個稀疏索引,只存放存在的字段在索引里面,不存在的不存放,也就是說當你使用{$exists:false}的時候,是不會走索引的,是全集合掃描。

db.test_new_wildidx.find({"block.attr":{$exists:false}})

db.test_new_wildidx.find({"block.attr":{$exists:true}})  但是支持true的。

2.通配符索引不支持直接等于/不等于一個對象或者數組。

通配符索引會將對象或者數組中的元素加載到索引中,而不是整體放到索引中。故通配符索引不支持直接用文檔或者數組來匹配。

所以上面的例子如果

7777:PRIMARY> db.test_new_wildidx.find({"block.attr.address_new": ["haicheng", "beijing", "chongqing"]})

就是想匹配整個數組的話,是不可能用到通配符索引的。

那么如果有這個需求該如何解決?Db.test_new_wildidx.createIndex({"block.attr.address_new":1}) 通過這個索引來解決。

雖然通配符索引不支持整個文檔或者對象直接精準匹配查詢,但是支持數組或者對象為空{} 這種操作:

7777:PRIMARY> db.test_new_wildidx.find({"block.attr": {}})7777:PRIMARY> db.test_new_wildidx.find({"block.attr.address_new": {}})

3. 通配符索引支持如下索引類型或者或者屬性:

Compound
TTL
Text
2d (Geospatial)
2dsphere (Geospatial)
Hashed
Unique

4.通配符索引不支持文檔中的數組$ne null這種。其實不光是數組,別的字段也同樣,只要是$ne都不會使用通配符索引。

5、總結

通配符索引在一定程度上可以應對在建模初期對于索引建立疏忽的遺漏,但是如果一味依賴通配符索引來解決查詢中的各種精確字段的匹配那就是鄭人買履了,在實際測試中通配符索引和精確字段的索引相比隨著數據的增長效率逐漸下滑。這也是官方不是很建議使用通配符索引來替代常規索引的原因。

到此這篇關于MongoDB通配符索引的文章就介紹到這了,更多相關MongoDB通配符索引內容請搜索武林網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持武林網!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成人久久久精品一区| 欧美午夜精品久久久久久久| 91精品久久久久久| 国产日韩在线一区| 久久欧美在线电影| 精品国内自产拍在线观看| 狠狠综合久久av一区二区小说| 日韩成人性视频| 国产精品美女午夜av| 久久99精品国产99久久6尤物| 亚洲国产精品人久久电影| 日韩成人中文字幕在线观看| 成人www视频在线观看| 亚洲男人天堂视频| 欧美成人免费观看| 国模gogo一区二区大胆私拍| 91精品视频网站| 国产精品国语对白| 国产亚洲aⅴaaaaaa毛片| 精品久久中文字幕久久av| 国产一区二区三区网站| 久久久亚洲影院你懂的| 91av在线视频观看| 亚洲jizzjizz日本少妇| 国产精选久久久久久| 亚洲伊人一本大道中文字幕| 亚洲欧美另类自拍| 97久久伊人激情网| 亚洲a∨日韩av高清在线观看| 亚洲精品av在线| 91九色视频导航| 欧美激情一区二区三区久久久| 国产欧美一区二区| 国产精品视频免费观看www| 国产精品久久久久久久久粉嫩av| 中文字幕久久久av一区| 日韩精品在线免费| 日本道色综合久久影院| 92裸体在线视频网站| 中文字幕av一区二区三区谷原希美| 国产精品久久一| 亲子乱一区二区三区电影| 国产91精品久| 亚洲精品理论电影| 日韩电影免费观看在线| 91av在线免费观看视频| 亚洲一区二区三区成人在线视频精品| 法国裸体一区二区| 久久久www成人免费精品| 久久精品视频亚洲| 亚洲国产成人精品久久| 国产成人一区三区| 久久精品久久久久| 日韩av在线天堂网| 伊人男人综合视频网| 亚洲精品国产精品国自产观看浪潮| 欧美激情视频一区二区三区不卡| 欧美中文字幕视频| 欧美理论片在线观看| www.国产一区| 日韩在线视频观看正片免费网站| 欧美成人免费小视频| 久久九九免费视频| 国产日韩在线观看av| 日韩有码在线观看| 91亚洲精品在线观看| 久久影院中文字幕| 亚洲精品成人网| 精品国产区一区二区三区在线观看| 日韩欧美极品在线观看| 日韩h在线观看| 欧美肥臀大乳一区二区免费视频| 欧美亚洲午夜视频在线观看| 91精品国产自产在线老师啪| 欧美精品福利视频| 国产日韩欧美夫妻视频在线观看| 久久伊人精品一区二区三区| 丁香五六月婷婷久久激情| 久久最新资源网| 欧美性受xxxx白人性爽| 国产一区二区三区在线看| 日韩国产高清污视频在线观看| 欧美性猛交xxxx黑人猛交| 亚洲精品久久久久久久久久久久久| 国产自摸综合网| 92看片淫黄大片欧美看国产片| 91成人福利在线| 奇米一区二区三区四区久久| 国产99久久久欧美黑人| 亚洲春色另类小说| 亚洲美女在线观看| 日韩av中文字幕在线播放| 日韩有码在线视频| 欧美野外wwwxxx| 在线观看日韩av| 精品久久久久久久久久国产| 欧美日韩性视频在线| 欧美精品在线网站| 成人黄色在线播放| 日本不卡视频在线播放| 亚洲欧美国产精品| 日韩黄色av网站| 亚洲美女又黄又爽在线观看| 日韩欧美aⅴ综合网站发布| 欧美日韩美女在线| 国产精品爽爽ⅴa在线观看| 久久亚洲精品中文字幕冲田杏梨| 国产精品久久久久久久久久三级| 中文欧美在线视频| 91牛牛免费视频| 欧美在线亚洲一区| 久久久久久久电影一区| 亚洲免费视频在线观看| 亚洲国产精品久久精品怡红院| 日韩a**站在线观看| 日韩久久午夜影院| 久久久精品2019中文字幕神马| 欧美激情综合色综合啪啪五月| 欧美精品久久久久久久久| 久久久久久网站| 欧美一级电影在线| 一本大道香蕉久在线播放29| 欧美一二三视频| 国产日韩换脸av一区在线观看| 亚洲黄页视频免费观看| 亚洲第一福利视频| 亚洲一区亚洲二区亚洲三区| 久久精品国产2020观看福利| 日韩av一区在线| 欧美猛男性生活免费| 亚洲精品久久久久久久久久久久久| …久久精品99久久香蕉国产| 欧美一级成年大片在线观看| 久久免费精品日本久久中文字幕| 日韩电影中文字幕在线观看| www.xxxx欧美| 精品精品国产国产自在线| 国产一区二区三区视频免费| 日韩激情av在线免费观看| 国产91精品网站| 91亚洲精华国产精华| 97超碰蝌蚪网人人做人人爽| 国产精品一区二区三| 国产精品久久久久久久久久免费| 国产视频综合在线| 欧美成人黑人xx视频免费观看| 成人激情黄色网| 色噜噜狠狠色综合网图区| 国产成人亚洲综合青青| 亚洲国产精品999| 92看片淫黄大片看国产片| 亚洲专区国产精品| 久国内精品在线| 尤物99国产成人精品视频| 欧美黑人xxxⅹ高潮交| 欧美电影免费观看| 亚洲天堂开心观看| 国产xxx69麻豆国语对白| 国产福利精品av综合导导航| 法国裸体一区二区| 亚洲a∨日韩av高清在线观看| 亚洲精品日韩丝袜精品| 国语自产偷拍精品视频偷| 狠狠做深爱婷婷久久综合一区|