返回顶部
首页 > 资讯 > 精选 >MongoDB索引类型怎么实现
  • 567
分享到

MongoDB索引类型怎么实现

2023-06-29 23:06:41 567人浏览 泡泡鱼
摘要

本文小编为大家详细介绍“MongoDB索引类型怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“mongoDB索引类型怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。MongoDB 4.2官方支持索引

本文小编为大家详细介绍“MongoDB索引类型怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“mongoDB索引类型怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

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

    • 单字段索引

    • 复合索引

    • 多键索引

    • 文本索引

    • 2dsphere索引

    • 2d索引

    • geoHaystack索引

    • 哈希索引

    单字段索引

    在单个字段上创建升序索引

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

    上述查询可以使用新建的单字段索引。

    在嵌入式字段上创建索引

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

    在内嵌文档上创建索引

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

    复合索引

    创建复合索引

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

    以下查询可以用到新建的复合索引

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

    多键索引

    基于一个数组创建索引,MongoDB会自动创建为多键索引,无需刻意指定。
    多键索引也可以基于内嵌文档来创建。
    多键索引的边界值的计算依赖于特定的规则。
    查看文档:

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

    创建score字段多键索引:

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

    查看执行计划:

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

    可以看到已经使用了新建的多键索引。

    文本索引

        为了支持对字符串内容的文本搜索查询,MongoDB提供了文本索引。文本(text )索引可以包含任何值为字符串或字符串元素数组的字段

    db.user.createIndex({"sku_attributes":"text"})
    db.user.find({$text:{$search:"测试"}})

    查看执行计划:

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

    可以看到通过文本索引可以查到包含测试关键字的数据。
    **注意:**可以根据自己需要创建复合文本索引。

    2dsphere索引

    创建测试数据

    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: "国贸",      category : "国贸"   })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" : "国贸", "category" : "国贸" }

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

    利用2dsphere索引查询球体上定义的圆内的点

    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" : "三元桥" }

    返回所有半径为经度 116.439518 E 和纬度 39.954751 N 的2英里内坐标。示例将2英里的距离转换为弧度,通过除以地球近似的赤道半径3963.2英里。

    2d索引

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

    • 您的数据库具有来自MongoDB 2.2或更早版本的旧版旧版坐标对。

    • 您不打算将任何位置数据存储为GeoJSON对象。

    哈希索引

    要创建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函数折叠嵌入的文档并计算整个值的hash值,但不支持多键(即.数组)索引。

    • 您不能创建具有hashed索引字段的复合索引,也不能在索引上指定唯一约束hashed;但是,您可以hashed在同一字段上创建索引和升序/降序(即非哈希)索引:MongoDB将对范围查询使用标量索引。

    读到这里,这篇“MongoDB索引类型怎么实现”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

    --结束END--

    本文标题: MongoDB索引类型怎么实现

    本文链接: https://lsjlt.com/news/326733.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • MongoDB索引类型怎么实现
      本文小编为大家详细介绍“MongoDB索引类型怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“MongoDB索引类型怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。MongoDB 4.2官方支持索引...
      99+
      2023-06-29
    • MongoDB索引类型汇总分享
      目录单字段索引在单个字段上创建升序索引在嵌入式字段上创建索引在内嵌文档上创建索引复合索引多键索引文本索引2dsphere索引创建测试数据添加2dsphere索引利用2dsphere索...
      99+
      2024-04-02
    • 【MongoDB学习笔记25】MongoDB的索引类型
      创建索引可以指定一些选项,使用不同的选项建立的索引会有不同的行为。 一、唯一索引唯一索引可以确保每一个文档的指定键都有唯一的值。例如,想确定文档中的username键不重复,创建一个唯一索引:&g...
      99+
      2024-04-02
    • MongoDB中怎么实现过期索引
      这篇文章给大家介绍MongoDB中怎么实现过期索引,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。范例:设置过期索引,10秒后过期> db.phones.createIndex({...
      99+
      2024-04-02
    • oracle索引类型怎么选择
      oracle 索引类型选择 在 Oracle 中,索引是提高查询性能的关键优化技术。选择适当的索引类型对于确保最佳性能至关重要。不同的索引类型具有不同的特点和用例,以下介绍了常见类型的索...
      99+
      2024-05-21
      oracle
    • PHP怎么实现搜索引擎类
      小编给大家分享一下PHP怎么实现搜索引擎类,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!PHP搜索引擎类1.类文件:class grabble{ &nb...
      99+
      2023-06-17
    • MongoDB的文本搜索与全文索引怎么实现
      MongoDB中的文本搜索和全文索引可以通过创建文本索引来实现。文本索引可以帮助MongoDB在文本字段上执行全文搜索,以查找包含特...
      99+
      2024-05-07
      MongoDB
    • MySQL中索引类型的实现原理是什么
      本篇文章给大家分享的是有关MySQL中索引类型的实现原理是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。  一、按表列属性分类:  1.单...
      99+
      2024-04-02
    • mongodb索引的实现原理是什么
      MongoDB使用B树(B-tree)索引来实现索引功能。B树是一种多叉树结构,每个节点可以有多个子节点。在B树中,所有节点都按照大...
      99+
      2024-04-10
      mongodb
    • MongoDB中索引怎么用
      小编给大家分享一下MongoDB中索引怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 在任何数...
      99+
      2024-04-02
    • mysql的索引类型和索引方法
      mysql 索引类型包括普通索引、唯一索引、全文索引、空间索引和哈希索引。索引方法有 btree、hash 和 rtree。选择合适的索引类型和方法取决于数据类型和查询模式,例如范围查找...
      99+
      2024-04-22
      mysql
    • Hive中的索引类型怎么使用
      在Hive中,可以使用CREATE INDEX语句来创建索引。Hive支持两种类型的索引:NORMAL和BITMAP。 创建NOR...
      99+
      2024-04-02
    • mysql中索引有什么类型
      这篇文章主要介绍mysql中索引有什么类型,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!MySQL目前主要有的索引类型为:普通索引、唯一索引、主键索引、组合索引、全文索引。下面本篇文...
      99+
      2024-04-02
    • mysql中索引类型是什么
      这篇文章给大家分享的是有关mysql中索引类型是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、索引类型主键索引只能作用于一个字段(列),字段值不能是null,也不能重复。唯一索引只能作用于一个字段,字段值...
      99+
      2023-06-15
    • mongodb怎么建立hash索引
      在MongoDB中,可以通过使用`createIndex()`方法来建立一个哈希索引。首先,连接到MongoDB数据库。然后,选择要...
      99+
      2023-09-06
      mongodb
    • mongodb中索引分类是怎样的以及如何创建索引
      mongodb中索引分类是怎样的以及如何创建索引,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。学习索引分类和创建索引:   &nbs...
      99+
      2024-04-02
    • MySQL中怎么使用索引的SQL类型
      本篇文章给大家分享的是有关MySQL中怎么使用索引的SQL类型,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1. 为什么使用索引在无索引的情况...
      99+
      2024-04-02
    • MYSQL(一)数据库索引类型,索引优点
      索引在mysql中也叫做键(key),是存储引擎用于快速找到记录的一种数据结构。索引结构类型(常见有两种):1. B-Tree索引大多数mysql引擎都支持这种索引;  &nb...
      99+
      2024-04-02
    • MySQL索引类型分类有哪些
      下面讲讲关于MySQL索引类型分类有哪些,文字的奥妙在于贴近主题相关。所以,闲话就不谈了,我们直接看下文吧,相信看完MySQL索引类型分类有哪些这篇文章你一定会有所受益。 一、索引的分类1、唯一索...
      99+
      2024-04-02
    • MySQL索引的各种类型
      什么是索引? 索引是数据库存储引擎用于快速查找到指定数据的一种数据结构。 可以用新华字典做类比:如果新华字典中对每个字的详细解释是数据库中表的记录,那么按部首或拼音等排序的目录就是索引,使用它可以让我们快速查找的某一...
      99+
      2022-05-30
      MySQL 索引 MySQL 索引类型
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作