• mongodb 索引分类


    一、 普通索引篇

    1、创建索引

        创建索引:db.person.ensureIndex({"age":1})。这里我们使用了ensureIndex在age上建立了索引。“1”:表示按照age进行升序,“-1”:表示按照age进行降序。

    2、复合索引

      在多个键上建立的索引就是复合索引,有时候我们的查询不是单条件的,可能是多条件,比如查找年龄在20~30名字叫‘ryan1’的同学,那么我们可以建立“age”和“name”的联合索引来加速查询。

      db.person.find({"age":{"$gte":20,"$lte":30},"name":"ryan1"})

    3、唯一索引

        唯一索引可以确保集合的每个文档的指定键都有唯一值。如果想保证不同文档的“name”键拥有不同的值,在“name”键上创建一个唯一索引就可以了。

        db.person.ensureIndex({"name":1},{"unique":true});

        然后用db.person.getIndexes()命令,查看目前person集合所有的索引。

        也可以创建复合的唯一索引。创建复合唯一索引时,单个键的值可以相同,但所有键的组合值必须是唯一的。

        db.person.ensureIndex({"name":1,"age":1},{"unique":true});

    4、稀疏索引

        唯一索引会把null看作值,所以无法将多个缺少唯一索引中的键的文档插入到集合中。然而,在有些情况下,你可能希望唯一索引只对包含相应键的文档生效。这个时候我们可以用到MongoDB中的稀疏索引。该索引与关系型数据库中的稀疏索引是完全不同的概念。MongoDB中的稀疏索引只是不需要将每个文档都作为索引条目。

        比如,如果有一个可选的mobilephone字段,但是,如果提供了这个字段,那么它的值必须是唯一的:

        db.person.ensureIndex({"mobilephone":1}{"unique":true,"sparse":true});

        稀疏索引不必是唯一的。只要去掉unique选项,就可以创建一个非唯一的稀疏索引。在下篇,将会讲解mongodb的稀疏索引。

    二、全文索引、地理位置索引

    主要介绍MongoDB中一些常用的特殊索引类型,主要包括:

    •     用于简单字符串搜索的全文本索引;
    •     用于球体空间(2dsphere)和二维平面(2d)的地理空间索引。 

    1、全文索引

        MongoDB有一个特殊的索引用在文档中搜索文本,之前的博客都是用精确匹配来查询字符串,这些技术有一定的限制。在搜索大块文本的速度非常慢,而且无法处理自然语言礼节的问题。全文本索引使用的是“倒排索引”的思想来做的,和当前非常开源的lucene(全文检索,Apacle基金会下的开源项目)项目是一样的思想来做的。使用全文本索引可以非常快的进行文本搜索,MongoDB支持多种语言,可惜在免费版中,并不支持世界第一的火星文语言(汉语)。查MongoDB的官网可以看到,在企业版中是支持汉语的全文索引的。

        如果公司用的是免费版的MongoDB,而又需要用到中文的全文索引,建议使用lucene或者solr等开源项目来做。(没钱就得用技术来补,赤裸裸的现实。)

        使用全文本检索需要专门开启这个功能才能进行使用。启动MongoDB时指定--setParameter textSearchEnabled=true选项,或者在运行时执行setParameter命令,都可以启用全文本索引。

    db.adminCommand({"setParameter":1,"textSearchEnabled":true});

       或者使用命令:

    mongod --setParameter textSearchEnabled=true

    2、2dsphere索引

        2dsphere索引是MongoDB最常用的地理空间索引之一,用于地球表面类型的地图。允许使用GeoJSON格式(http://www.geojson.org)指定点、线、多边形。

        点可以用形如[longitude,latitude]([经度,纬度])的两个元素的数组表示("loc"字段的名字可以是任意的,但是其中的子对象是有GeoJSON指定的,不能改变):

    {

        "name":"beijing",

        "loc":{

            "type":"Point",

            "coordinates":[40,2]

        } 

    }

        线可以用一个由点组成的数组来表示:

    {

        "name":"changjiang",

        "loc":{

            "type":"Line",

            "coordinates":[[1,2],[2,3],[3,4]]

        } 

    }

        多边形的表示方式与线一样,但是“type”不同:

    {

        "name":"shenzhen",

        "loc":{

            "type":"Polygon",

            "coordinates":[[1,2],[2,3],[3,4]]

        } 

    }

        创建2dsphere索引: 

    db.mapinfo.ensureIndex({"loc":"2dsphere"})

        地理空间查询的类型有三种:交集(intersection)、包含(within)、接近(nearness)。查询时,需要将希望查找的内容指定为形如{"$geometry":geoJsonDesc}的GeoJSON对象。

        使用“$geoIntersects”查询位置相交的文档:

    var customMapinfo = {

        "type":"Polygon",

        "coordinates":[[12.2223,39,4424],[13.2223,38,4424],[13.2223,39,4424]]

    }

    db.mapinfo.find({

        "loc":{"$geoIntersects":{"$geometry":customMapinfo}}

    })

        这样就会找到所有与customMapinfo区域有交集的文档。

        使用“$within”查询完全包含在某个区域的文档:

    db.mapinfo.find({

        "loc":{"$within":{"$geometry":customMapinfo}}

    })

        使用“$near”查询附近的位置:

    db.mapinfo.find({

        "loc":{"$within":{"$geometry":customMapinfo}}

    })

    3、2d索引

        2d索引也是MongoDB最常用的地理空间索引之一,用于游戏地图。2d索引用于扁平表面,而不是球体表面。如果用在球体表面上,在极点附近会出现大量的扭曲变形。

        文档中应该使用包含两个元素的数组表示2d索引字段。

    {

        "name":"node1",

        "tile":[32,22]

    }

        创建索引

    db.gameMapinfo.ensureIndex({"tile":"2d"})

        使用$near查询点[20,20]附近的文档:

    db.gameMapinfo.find({"tile":{"$near":[20,20]}})

        使用$within查询出某个形状(矩形、圆形或者多边形)范围内的所有文档。

        矩形,可以指定$box选项($box接受一个两元素的数组,第一个元素指定左下角的坐标,第二个元素指定右上角的坐标):

    db.gameMapinfo.find({"tile":{"$within":{"$box":[[10,20],[15,30]]}}})

        圆形,可以指定$center选项($center接受一个两元素数组作为参数,第一个元素是一个点,用于指定圆心,第二个元素用于指定半径):

    db.gameMapinfo.find({"tile":{"$within":{"$center":[[12,12],5]}}})

        多边形,可以指定$polygon($ploygon接受一个多元素的数组,每个元素对应多边形的点),下面以一个三角形为例:

    db.gameMapinfo.find({"tile":{"$within":{"$polygon":[[0,20],[10,0],[-10,0]]}}})

  • 相关阅读:
    2.1 String的特性
    sql语句对列进行操作
    java 集合排序
    C#抽象类及其方法的学习
    haproxy+keepalived实现高可用负载均衡
    RPC框架简易实现
    WCF中的ServiceHost初始化两种方式
    C# Stopwatch与TimeSpan详解
    HBase入门篇
    nginx+tomcat+redis完成session共享
  • 原文地址:https://www.cnblogs.com/GtShare/p/7661006.html
Copyright © 2020-2023  润新知