最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mongodb多鍵索引中索引邊界的混合問題小結(jié)

 更新時間:2024年07月17日 12:02:12   作者:威贊  
Mongodb為提高數(shù)組的查詢效率,針對數(shù)組構(gòu)建了多鍵索引,而Mongodb在應(yīng)用多鍵數(shù)組查詢時,也通過構(gòu)建,減少數(shù)組查詢的數(shù)值范圍,來提高查詢性能,本文結(jié)合Mongodb官方文檔,闡述Mongodb在使用多鍵索引時的邊界優(yōu)化,感興趣的朋友一起看看吧

學(xué)習(xí)mongodb,體會mongodb的每一個使用細(xì)節(jié),歡迎閱讀威贊的文章。這是威贊發(fā)布的第93篇mongodb技術(shù)文章,歡迎瀏覽本專欄威贊發(fā)布的其他文章。如果您認(rèn)為我的文章對您有幫助或者解決您的問題,歡迎在文章下面點個贊,或者關(guān)注威贊。謝謝。

Mongodb為提高數(shù)組的查詢效率,針對數(shù)組構(gòu)建了多鍵索引。而Mongodb在應(yīng)用多鍵數(shù)組查詢時,也通過構(gòu)建,減少數(shù)組查詢的數(shù)值范圍,來提高查詢性能。本文結(jié)合Mongodb官方文檔,闡述Mongodb在使用多鍵索引時的邊界優(yōu)化。

概述

索引邊界定義了索引值的區(qū)間段。Mongodb在查詢時,用這個區(qū)間段來查詢索引中的數(shù)據(jù)。當(dāng)用戶針對索引字段指定多個查詢條件時,mongdb嘗試合并這些查詢條件的區(qū)間范圍來計算出更小的范圍區(qū)間,來獲得更快的查詢速度并減少資源利用。

使用多鍵索引的邊界交集來查詢

邊界交集代表多個邊界相互重合的點。如有兩個區(qū)間[3, 無窮大]和[無窮小,6],這兩個區(qū)間的交集就是[3,6]。Mongodb將這種求交集的方式,應(yīng)用到數(shù)據(jù)查詢當(dāng)中。有一個構(gòu)建了索引的數(shù)組字段,當(dāng)使用$elemMatch指定多個查詢條件查詢數(shù)據(jù)時,Mongodb會將查詢條件合并。下邊的例子,說明了這種查詢優(yōu)化方法。

構(gòu)建結(jié)合students并插入數(shù)據(jù)

db.students.insertMany([
    {_id: 1, name: 'Shawn', grades: [70,85]},
    {_id: 2, name: 'Elena', grades: [92, 84]}
])

為數(shù)組創(chuàng)建多鍵索引

db.students.createIndex({grades: 1})

構(gòu)建查詢語句

db.students.find( { grades: { $elemMatch: { $gte: 90, $lte:99 } } } )

這個語句中,只要數(shù)組中任何一個數(shù)據(jù)符合大于等于90,小于等于99的數(shù)據(jù)。

單獨分析每個查詢條件,第一個邊界是[90,無窮大],第二個邊界是[無窮小,99],在使用$elemMatch時,mongodb先計算兩個邊界的交集[90,99]

當(dāng)不使用$elemMatch時,Mongodb不會先計算邊界的交集。

db.students.find( { grades: { $gte: 90, $lte:99 } }  )

該查詢會查詢出滿足下面兩個條件的文檔

  • 數(shù)組grades中至少有一個元素大于等于90
  • 數(shù)組grades中至少有一個元素小于等于99

因為沒有使用$elemMatch, Mongodb不會計算邊界的交集。而是使用兩個邊界中的任何一個來查找,不能保證使用哪一個條件。

從解釋計劃當(dāng)中也能看出來兩者查詢數(shù)據(jù)范圍的不同

db.students.find( { grades: { $elemMatch: { $gte: 90, $lte:99 } } } ).explain()
db.students.find( { grades: { $gte: 90, $lte:99 } }  ).explain()

下面兩張圖片中,左邊使用了$elemMatch, 右側(cè)沒有使用

復(fù)合多鍵索引邊界混合

復(fù)合邊界集合了復(fù)合多鍵索引中的邊界。使用復(fù)合多鍵索引的多個字段邊界值,能夠減少查詢時間。Mongodb不需要單獨計算每個邊界的查詢結(jié)果。如符合索引{temperature: 1, humidity: 1}有下面的兩個邊界

  • 溫度[80, 無窮大]
  • 濕度[無窮小,20]

則計算出來的復(fù)合邊界就是

{ temperature: [80, 無窮大], humidity: [無窮小,20]}

如果mongodb不能將這兩個邊界混合,mongodb只能夠使用前面的字段索引來查詢數(shù)據(jù)。在這個例子中,前面的字段是temperature。下面的應(yīng)用,詳細(xì)描述了mongodb在復(fù)合多鍵索引中的邊界混合。

非數(shù)組字段和數(shù)組字段的邊界混合

這個例子展示了mongodb通過混合邊界來定義更高效的查詢約束提高性能

構(gòu)建survey集合并插入數(shù)據(jù)

db.survey.insertMany([
    { _id: 1, item: "abc", ratings: [ 2, 5, 8 ] },
    { _id: 2, item: "xyz", ratings: [ 5, 8 ] }
])

創(chuàng)建復(fù)合多鍵索引

db.survey.createIndex({item: 1, ratings: 1})

構(gòu)建查詢語句

db.survey.find({item: "abc", ratings: { $gte: 3}})

直接看執(zhí)行計劃,會更清楚一些

該查詢使用字段item和數(shù)組字段rating進行查找。單獨來看么一個查詢條件

item字段值是“abc”, mongodb在執(zhí)行時,轉(zhuǎn)換為邊界["abc", "abc"]

rating邊界是{$gte: 3},轉(zhuǎn)換為[3,無窮大]

mongodb將兩個邊界組合進行查詢

非數(shù)組字段和多個數(shù)組字段的邊界混合

下面的例子展現(xiàn)了mongodb怎樣將非數(shù)組字段和多個數(shù)組字段的邊界混合

構(gòu)建集合survey2并插入數(shù)據(jù)

db.survey2.insertMany([
    { _id: 1, item: "abc", ratings: [ { score: 2, by: "mn"}, { score: 9, by: "anon"}] },
    { _id: 2, item: "xyz", ratings: [  { score: 5, by: "anon"}, { score: 7, by: "wv"}] }
])

為集合添加符合多鍵索引

db.survey2.createIndex({item: 1, "ratings.score": 1, "ratings.by": 1})

構(gòu)建查詢語句

db.surver2.find({item: "xyz", "ratings.score": { $lte: 5}, "ratings.by": "anon"})

單獨看每個查詢條件

  • item字段的邊界 item: "xyz", 轉(zhuǎn)換為[["xyz", "xyz"]]
  • score的邊界是{$lte:5},轉(zhuǎn)換為[無窮小, 5],
  • by的邊界是 by: "anon",轉(zhuǎn)換為["anon", "anon"]

Mongodb 將item的邊界和ratings.score或ratings.by當(dāng)中的一個邊界混合,取決于查詢操作符和索引值。當(dāng)mongodb不能確認(rèn)使用哪個邊界來進行混合。執(zhí)行計劃也無法確定使用哪個索引來進行查詢。

為了保證mongodb能夠?qū)⑽臋n數(shù)組中的邊界混合,必須使用$elemMatch操作符

混合相同數(shù)組中多個字段的邊界

為了能夠混合相同數(shù)組中多個字段的索引邊界,必須滿足下面兩個條件

  • 除了字段名稱以外,索引鍵必須在相同的路徑上
  • 查詢語句必須使用$elemMatch查詢相同路徑上的值

在嵌入式文檔數(shù)組中,使用點操作符的字段名稱,如“a.b.c.d”, 就是字段d的字段路徑。為了能夠混合相同數(shù)組中的多個邊界,$elemMatch必須在這個路徑上,并且不包含字段本身。如“a.b.c”

在前面創(chuàng)建的集合survey2中添加索引

db.surver2.createIndex({"ratings.score": 1, "ratings.by": 1})

構(gòu)建查詢語句, 使用$elemMatch操作符查詢ratings字段,查詢出滿足兩個條件的數(shù)據(jù)。

db.surver2.find({ratings: {$elemMatch: {score: {$lte: 5}, by: "anon"}}})

看查詢計劃,能夠看到mongodb混合了兩個邊界為一個邊界

到此這篇關(guān)于Mongodb多鍵索引中索引邊界的混合的文章就介紹到這了,更多相關(guān)Mongodb多鍵索引邊界內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 映射MongoDB _id字段的幾種常見方式

    映射MongoDB _id字段的幾種常見方式

    在 Spring Data MongoDB 中,將 Java POJO 的字段映射到 MongoDB 文檔的 _id 字段非常直接,主要通過 @Id 注解(org.springframework.data.annotation.Id)來完成,本文介紹了映射 MongoDB _id 字段的幾種常見方式和關(guān)鍵點,需要的朋友可以參考下
    2025-05-05
  • 【MongoDB for Java】Java操作MongoDB數(shù)據(jù)庫

    【MongoDB for Java】Java操作MongoDB數(shù)據(jù)庫

    本篇文章現(xiàn)在我們就用Java來操作MongoDB的數(shù)據(jù)。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • Windows系統(tǒng)安裝運行Mongodb服務(wù)

    Windows系統(tǒng)安裝運行Mongodb服務(wù)

    今天小編就為大家分享一篇關(guān)于Windows系統(tǒng)安裝運行Mongodb服務(wù),小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • mongodb基礎(chǔ)之用戶權(quán)限管理實例教程

    mongodb基礎(chǔ)之用戶權(quán)限管理實例教程

    這篇文章主要給大家介紹了關(guān)于mongodb基礎(chǔ)之用戶權(quán)限管理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-06-06
  • mongodb 數(shù)據(jù)生成Insert 語句的示例代碼

    mongodb 數(shù)據(jù)生成Insert 語句的示例代碼

    這篇文章主要介紹了mongodb 數(shù)據(jù)生成Insert 語句的示例代碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作,具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • MongoDB視圖的修改與刪除的實現(xiàn)

    MongoDB視圖的修改與刪除的實現(xiàn)

    視圖為mongodb的操作和數(shù)據(jù)安全上提供了便利,本文主要介紹了MongoDB視圖的修改與刪除的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • mongodb禁止外網(wǎng)訪問及添加賬號的操作方法

    mongodb禁止外網(wǎng)訪問及添加賬號的操作方法

    這篇文章主要介紹了mongodb禁止外網(wǎng)訪問及添加賬號的操作方法,需要的朋友可以參考下
    2017-12-12
  • MongoDB使用profile分析慢查詢的步驟

    MongoDB使用profile分析慢查詢的步驟

    這篇文章主要介紹了MongoDB profile分析慢查詢的示例,幫助大家更好的理解和學(xué)習(xí)使用MongoDB數(shù)據(jù)庫,感興趣的朋友可以了解下
    2021-04-04
  • MongoDB中sort()排序方法、aggregate()聚合方法和索引代碼示例

    MongoDB中sort()排序方法、aggregate()聚合方法和索引代碼示例

    這篇文章主要給大家介紹了關(guān)于MongoDB中sort()排序方法、aggregate()聚合方法和索引的相關(guān)資料,MongoDB的聚合函數(shù)Aggregate是一組用于對MongoDB中的數(shù)據(jù)集進行聚合操作的函數(shù),文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-04-04
  • mongoDB中聚合函數(shù)java處理示例詳解

    mongoDB中聚合函數(shù)java處理示例詳解

    這篇文章主要給大家介紹了關(guān)于mongoDB中聚合函數(shù)java處理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用mongoDB具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04

最新評論

阳东县| 铜山县| 灵丘县| 沂南县| 荔波县| 衢州市| 乌拉特中旗| 逊克县| 和林格尔县| 蒙阴县| 敦煌市| 绵阳市| 涟水县| 洛扎县| 阳东县| 遂宁市| 藁城市| 泌阳县| 上蔡县| 安康市| 皋兰县| 吉隆县| 浮梁县| 萨嘎县| 博湖县| 大化| 都匀市| 郸城县| 连平县| 社会| 迁西县| 新安县| 澄城县| 年辖:市辖区| 会宁县| 乐至县| 金华市| 聂拉木县| 绍兴市| 茂名市| 科技|