欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MongoDB通配符索引的用法實(shí)例

 更新時(shí)間:2020年09月08日 10:44:47   作者:DBA團(tuán)隊(duì)  
這篇文章主要給大家介紹了關(guān)于MongoDB通配符索引的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

指南

MongoDB在4.2 版本推出了Wildcard Indexes,究竟什么是Wildcard Indexes以及Wildcard Indexes適合哪些場(chǎng)景本文結(jié)合官方文檔以及實(shí)際測(cè)試進(jìn)行簡(jiǎn)單概述。

1、通配符索引示例

因?yàn)镸ongoDB是dynamic schemas,所以應(yīng)用是可以查詢(xún)?nèi)魏我阎侄位蛘唠S機(jī)字段的。

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

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

但是在查詢(xún)的時(shí)候可能是如下語(yǔ)句:

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" })

是否能通過(guò)一個(gè)索引來(lái)完成上述需求?

答案是肯定的,上述查詢(xún)可以通過(guò)通配符索引來(lái)實(shí)現(xiàn)既定需求,也就是 db.colA.createIndex( { "userMetadata.$**" : 1 } )。

那么如何創(chuàng)建通配符索引?

注意:首先應(yīng)該明確的是通配符索引只在版本兼容性4.2的時(shí)候才能創(chuàng)建。

如何查詢(xún)版本兼容性?

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

如何設(shè)置?

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"
 }
 }
}

如果數(shù)據(jù)結(jié)構(gòu)是上面這樣的,其中product_attributes 屬性包含任何的結(jié)構(gòu)。

那么如果我們創(chuàng)建一個(gè)這個(gè)索引,它會(huì)進(jìn)行什么操作?

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

因?yàn)閜roduct_attributes 里面包含數(shù)組和嵌套文檔等對(duì)象,實(shí)際創(chuàng)建這個(gè)索引后,會(huì)迭代嵌套文檔或者數(shù)組把里面的所有的值都取出來(lái)放到索引里。支持如下查詢(xún):

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}})

全字段的通配符索引

可以通過(guò)下面的語(yǔ)句創(chuàng)建一個(gè)索引,索引中包含集合中的所有字段,但是不包括_id(如果想包含_id可以通過(guò)wildcardProjection 來(lái)設(shè)置),如果集合中的字段包含數(shù)組或者嵌套對(duì)象的話(huà),那么會(huì)迭代數(shù)組或者嵌套對(duì)象并把值放到索引中。

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

給每個(gè)文檔添加一個(gè)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"})

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

在全字段的基礎(chǔ)上創(chuàng)建一個(gè)明確包含哪些字段的索引:

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

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

在全字段的基礎(chǔ)上創(chuàng)建一個(gè)明確不包含哪些字段的索引:

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

3、通配符索引的行為

通配符索引的行為根據(jù)其字段類(lèi)型不同而有所不同。

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

通配符索引對(duì)于顯示數(shù)組位置的查詢(xún)

通配符索引雖然不會(huì)記錄給定數(shù)組中的元素下標(biāo),但是,MongoDB仍然可以選擇通配符索引來(lái)滿(mǎn)足包含一個(gè)或多個(gè)顯式數(shù)組索引的字段路徑的查詢(xún)(for example, parentArray.0.nestedArray.0)

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

如果超過(guò)了8個(gè)以上顯示數(shù)組索引的話(huà)MongoDB 會(huì)考慮另外的索引或者執(zhí)行全集合掃描。如下結(jié)構(gòu):

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

請(qǐng)注意,通配符索引本身對(duì)索引文檔時(shí)遍歷文檔的深度沒(méi)有任何限制;該限制僅適用于顯式指定精確數(shù)組索引的查詢(xún)。通過(guò)發(fā)出沒(méi)有顯式數(shù)組索引的相同查詢(xún),MongoDB可以選擇通配符索引來(lái)回答查詢(xún)。

4、通配符索引的限制

1.首先通配符索引是一個(gè)稀疏索引,只存放存在的字段在索引里面,不存在的不存放,也就是說(shuō)當(dāng)你使用{$exists:false}的時(shí)候,是不會(huì)走索引的,是全集合掃描。

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

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

2.通配符索引不支持直接等于/不等于一個(gè)對(duì)象或者數(shù)組。

通配符索引會(huì)將對(duì)象或者數(shù)組中的元素加載到索引中,而不是整體放到索引中。故通配符索引不支持直接用文檔或者數(shù)組來(lái)匹配。

所以上面的例子如果

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

就是想匹配整個(gè)數(shù)組的話(huà),是不可能用到通配符索引的。

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

雖然通配符索引不支持整個(gè)文檔或者對(duì)象直接精準(zhǔn)匹配查詢(xún),但是支持?jǐn)?shù)組或者對(duì)象為空{(diào)} 這種操作:

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

3. 通配符索引支持如下索引類(lèi)型或者或者屬性:

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

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

5、總結(jié)

通配符索引在一定程度上可以應(yīng)對(duì)在建模初期對(duì)于索引建立疏忽的遺漏,但是如果一味依賴(lài)通配符索引來(lái)解決查詢(xún)中的各種精確字段的匹配那就是鄭人買(mǎi)履了,在實(shí)際測(cè)試中通配符索引和精確字段的索引相比隨著數(shù)據(jù)的增長(zhǎng)效率逐漸下滑。這也是官方不是很建議使用通配符索引來(lái)替代常規(guī)索引的原因。

到此這篇關(guān)于MongoDB通配符索引的文章就介紹到這了,更多相關(guān)MongoDB通配符索引內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 聊聊MongoDB?帶訪問(wèn)控制的副本集部署問(wèn)題

    聊聊MongoDB?帶訪問(wèn)控制的副本集部署問(wèn)題

    這篇文章主要介紹了MongoDB?帶訪問(wèn)控制的副本集部署,本文給大家分享簡(jiǎn)單的步驟幫助大家完成,對(duì)MongoDB副本集部署問(wèn)題感興趣的朋友一起看看吧
    2022-02-02
  • Windows系統(tǒng)啟動(dòng)MongoDB報(bào)錯(cuò)無(wú)法連接服務(wù)器的問(wèn)題及解決方案

    Windows系統(tǒng)啟動(dòng)MongoDB報(bào)錯(cuò)無(wú)法連接服務(wù)器的問(wèn)題及解決方案

    在Windows系統(tǒng)中啟動(dòng)MongoDB時(shí)遇到連接拒絕的錯(cuò)誤,通常是因?yàn)榉?wù)未運(yùn)行或配置問(wèn)題,本文給大家分享Windows系統(tǒng)啟動(dòng)MongoDB報(bào)錯(cuò)無(wú)法連接服務(wù)器的問(wèn)題及解決方案,一起看看吧
    2024-10-10
  • mongodb數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)之連表查詢(xún)

    mongodb數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)之連表查詢(xún)

    這篇文章主要給大家介紹了關(guān)于mongodb數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)之連表查詢(xún)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用mongodb具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • Ubuntu16.04手動(dòng)安裝MongoDB的詳細(xì)教程

    Ubuntu16.04手動(dòng)安裝MongoDB的詳細(xì)教程

    本篇文章主要介紹了Ubuntu16.04手動(dòng)安裝MongoDB的詳細(xì)教程,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-07-07
  • 高效mongodb的php分頁(yè)類(lèi)(不使用skip)

    高效mongodb的php分頁(yè)類(lèi)(不使用skip)

    這篇文章主要介紹了高效mongodb的php分頁(yè)類(lèi),并且沒(méi)有使用mongodb的skip來(lái)實(shí)現(xiàn)分頁(yè),需要的朋友可以參考下
    2014-05-05
  • MongoDB的創(chuàng)建、更新和刪除

    MongoDB的創(chuàng)建、更新和刪除

    下面開(kāi)始學(xué)習(xí)MongoDB最重要也是最基礎(chǔ)的部分:C(創(chuàng)建)R(查詢(xún))U(更新)D(刪除);由于R(查詢(xún))操作相對(duì)來(lái)說(shuō)內(nèi)容比較多,也比較繁瑣,同時(shí)使用頻率也比較高,所以下一篇會(huì)拿出來(lái)單獨(dú)介紹。廢話(huà)不多說(shuō),連上服務(wù)器,我們直接進(jìn)入正題
    2017-05-05
  • MongoDB教程之入門(mén)基礎(chǔ)知識(shí)

    MongoDB教程之入門(mén)基礎(chǔ)知識(shí)

    這篇文章主要介紹了MongoDB教程之入門(mén)基礎(chǔ)知識(shí),本文講解了文檔的注意事項(xiàng)、使用多個(gè)集合的必要性、集合的命名注意事項(xiàng)、數(shù)據(jù)庫(kù)、MongoDB的啟動(dòng)、Shell的使用小技巧等內(nèi)容,需要的朋友可以參考下
    2015-05-05
  • MongoDB入門(mén)教程之Windows下的MongoDB數(shù)據(jù)庫(kù)安裝圖解

    MongoDB入門(mén)教程之Windows下的MongoDB數(shù)據(jù)庫(kù)安裝圖解

    這篇文章主要介紹了MongoDB入門(mén)教程之Windows下的MongoDB數(shù)據(jù)庫(kù)安裝圖解,本文還講解了MongoDB的基本操作,如insert、find、 update、remove等操作,需要的朋友可以參考下
    2014-08-08
  • centos yum 安裝 mongodb 以及php擴(kuò)展

    centos yum 安裝 mongodb 以及php擴(kuò)展

    MongoDB是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫(kù)。由C++語(yǔ)言編寫(xiě)。旨在為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。
    2014-07-07
  • MongoDB特點(diǎn)與體系結(jié)構(gòu)等簡(jiǎn)介

    MongoDB特點(diǎn)與體系結(jié)構(gòu)等簡(jiǎn)介

    今天小編就為大家分享一篇關(guān)于MongoDB特點(diǎn)與體系結(jié)構(gòu)等簡(jiǎn)介,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01

最新評(píng)論