文档章节

MongoDB索引

满小茂
 满小茂
发布于 2016/09/02 16:54
字数 1571
阅读 69
收藏 3

1.创建索引

--单索引

> db.test.ensureIndex({"username":1})

复合索引

--数字1表示username键的索引按升序存储,-1表示age键的索引按照降序方式存储。

>db.test.ensureIndex({"username":1, "age":-1})   

 为索引创建名字

> db.test.ensureIndex({"username":1},{"name":"testindex"})    

为内嵌文档建立索引值

>db.test.ensureIndex({"comments.date":1})

2.创建唯一性索引

> db.test.ensureIndex({"userid":1},{"unique":true})

--创建唯一索引,并消除重复数据。

> db.test.ensureIndex({"userid":1},{"unique":true,"dropDups":true})    

3.删除索引

> db.test.dropIndex({"userid":1}) 

4. 使用explain查看执行是否使用索引等

    explain是非常有用的工具,会帮助你获得查询方面诸多有用的信息。只要对游标调用该方法,就可以得到查询细节。explain会返回一个文档,而不是游标本身。如:
    > db.test.find().explain("executionStats")

   explain会返回查询使用的索引情况,耗时和扫描文档数的统计信息。
 

 

5. 全文索引

最初的文本搜索只是一种试验性功能,但从 2.6 版本起就成为默认功能了。但如果使用的是之前的 MongoDB,则需要使用下列代码启用文本搜索:

>db.adminCommand({setParameter:true,textSearchEnabled:true})

假设在 posts 集合中的下列文档中含有帖子文本及其标签。

{
"post_text": "enjoy the mongodb articles on tutorialspoint",
"tags": [
"mongodb",
"tutorialspoint"
]
}

我们将在 post_text 字段上创建文本索引,以便搜索帖子文本之内的内容。

>db.posts.ensureIndex({post_text:"text"})

现在我们已经在 post_text 字段上创建了文本索引,接下来搜索包含 tutorialspoint 文本内容的帖子。

>db.posts.find({$text:{$search:"tutorialspoint"}})

在返回的结果文档中,果然包含了具有 tutorialspoint 文本的帖子文本。

{
"_id" : ObjectId("53493d14d852429c10000002"),
"post_text" : "enjoy the mongodb articles on tutorialspoint",
"tags" : [ "mongodb", "tutorialspoint" ]
}
{
"_id" : ObjectId("53493d1fd852429c10000003"),
"post_text" : "writing tutorials on mongodb",
"tags" : [ "mongodb", "tutorial" ]
}


如果用的是旧版本的 MongoDB,则需使用下列代码:
>db.posts.runCommand("text",{search:" tutorialspoint "})
总之,与普通搜索相比,使用文本搜索可极大地改善搜索效率。

spring-data-mongodb使用方法
http://spring.io/blog/2014/07/17/text-search-your-documents-with-spring-data-mongodb

6. 地理空间索引        

    MongoDB的地理位置查询

    MongoDB地理位置索引常用的有两种。

  • 2d 平面坐标索引,适用于基于平面的坐标计算。也支持球面距离计算,不过官方推荐使用2dsphere索引。
  • 2dsphere 几何球体索引,适用于球面几何运算

    建立索引:

> db.places.ensureIndex({'coordinate':'2d'})
> db.places.ensureIndex({'coordinate':'2dsphere'})

    查询方式:

      而查询坐标参数则分两种:

      1.坐标对(经纬度)根据查询命令的不同,$maxDistance距离单位可能是 弧度 和 平面单位(经纬度的“度”):

db.<collection>.find( { <location field> :
                   { $nearSphere: [ <x> , <y> ] ,
                     $maxDistance: <distance in radians>
                } } )

       2.GeoJson $maxDistance距离单位默认为米:

db.<collection>.find( { <location field> :
                   { $nearSphere :
                     { $geometry :
                        { type : "Point" ,
                          coordinates : [ <longitude> , <latitude> ] } ,
                       $maxDistance : <distance in meters>
             } } } )

案例使用:

查询附近的人:

               查询当前坐标附近的目标,由近到远排列。

    可以通过$near或$nearSphere,这两个方法类似,但默认情况下所用到的索引和距离单位不同。

  查询方式:

> db.places.find({'coordinate':{$near: [121.4905, 31.2646]}})
> db.places.find({'coordinate':{$nearSphere: [121.4905, 31.2646]}})

  查询结果:

{ 
    "_id" : 115, 
    "coordinate" : { 
        "longitude" : 121.4915, 
        "latitude" : 31.25933 
    }, 
    "title" : "仅售148元,市场价298元的星程上服假日酒店全日房一间入住一天,
节假日通用,精致生活,品质享受", 
    "address" : "虹口区天水路90号" 
}
// …(100条)

    上述查询坐标[121.4905, 31.2646]附近的100个点,从最近到最远排序。

    默认返回100条数据,也可以用limit()指定结果数量,如:

db.places.find({'coordinate':{$near: [121.4905, 31.2646]}}).limit(2)

     指定最大距离 $maxDistance

> db.places.find({'coordinate':{$near: [121.4905, 31.2646], $maxDistance:2}})

 区域内搜索: 

MongoDB中的范围搜索(Inclusion)主要用$geoWithin这个命令,它又细分为3种不同类型,如下:

  1. $box 矩形
  2. $center 圆(平面),$centerSphere圆(球面)$center和$centerSphere在小范围内的应用几乎没差别(除非这个圆半径几百上千公里)。
  3. $polygon 多边形

  (A) 矩形查询:

> db.places.find( 
    { 
        coordinate : { 
            $geoWithin : { 
                $box :[ [ 121.44, 31.25 ] , [ 121.5005, 31.2846 ] ] 
            } 
        } 
    } 
)

 

 (B) 圆形查询   

    应用场景有:地图搜索租房信息

    查询以某坐标为圆心,指定半径的圆内的数据。

    前面已提到,圆形区域搜索分为$center$centerSphere这两种类型,它们的区别主要在于支持的索引和默认距离单位不同。2d索引能同时支持$center和$centerSphere,2dsphere索引支持$centerSphere。关于距离单位,$center默认是度,$centerSphere默认距离是弧度。

> db.places.find({'coordinate':{$geoWithin:{$centerSphere:[ [121.4905, 31.2646] ,
0.6/111] }}})

 

 db.places.find({'coordinate':{$geoWithin:{$centerSphere:[ [121.4905, 31.2646] ,
0.6/6371] }}})

查询结果:  

{ 
    "_id" : 115, 
    "coordinate" : { 
        "longitude" : 121.4915, 
        "latitude" : 31.25933 
    }, 
    "title" : "仅售148元,市场价298元的星程上服假日酒店全日房一间入住一天,节假日通用,
精致生活,品质享受", 
    "address" : "虹口区天水路90号" 
}
...

 

 (C) 多边形查询

  复杂区域内的查询,这个应用场景比较少见。指定至少3个坐标点,查询方式如下(五边形):

> db.places.find( { coordinate : { $geoWithin : { $polygon : [ 
    [121.45183 , 31.243816] ,
    [121.533181, 31.24344] ,
    [121.535049, 31.208983] ,
    [121.448955, 31.214913] ,
    [121.440619, 31.228748]
] } } } )

 

附近的餐厅:

  假设需要以当前坐标为原点,查询附近指定范围内的餐厅,并直接显示距离。

  这个需求用前面提到的$near是可以实现的,但是距离需要二次计算。这里我们用$geoNear这个命令查询。

  $geoNear与$near功能类似,但提供更多功能和返回更多信息,官方文档是这么解释的

  $near方法查询后会对结果集对距离进行排序,而$geoWithin是无序的

> db.runCommand( { geoNear: "places", near: [ 121.4905, 31.2646 ], spherical: true,
 maxDistance:1/6371, num:2 })
{
    "ns" : "mongo_test.places",
    "near" : "1110001100111100001011010110010111001000110011111101",
    "results" : [
        {
            "dis" : 0.00009318095248858048,
            "obj" : {
                "_id" : 115,
                "coordinate" : {
                    "longitude" : 121.4915,
                    "latitude" : 31.25933
                },
                "title" : "仅售148元,市场价298元的星程上服假日酒店全日房一间入住一天,
节假日通用,精致生活,品质享受",
                "address" : "虹口区天水路90号"
            }
        },
        {
            "dis" : 0.00010610660597329082,
            "obj" : {
                "_id" : 465,
                "coordinate" : {
                    "longitude" : 121.48406,
                    "latitude" : 31.26202
                },
                "title" : "【四川北路】热烈庆祝康骏会馆成立8周年!仅售169元!市场价399元的
康骏会馆四川北路一店(仅限3星级技师)全身精油按摩一人次!全程约90分钟!
男女不限!仅限四川北路一店使用,非本市所有门店通用!拉手券消费仅限每日19:00前!
健康有道,骏越万里!",
                "address" : "虹口区四川北路1896号-1904号201室"
            }
        }
    ],
    "stats" : {
        "time" : 0,
        "btreelocs" : 0,
        "nscanned" : 18,
        "objectsLoaded" : 12,
        "avgDistance" : 0.00009964377923093564,
        "maxDistance" : 0.0001064199324957278
    },
    "ok" : 1
}

              

© 著作权归作者所有

共有 人打赏支持
满小茂
粉丝 76
博文 120
码字总数 135336
作品 0
成都
程序员
私信 提问
MongoDB 1000W级数据 Insert和Query和Delete性能测试(分别测试 不加索引 和 加索引)

先看下测试机性能(64bit): 测试程序: 不加索引测试: ......................# MongoDB 不加索引 插入1000W条测试 #................... ......................# MongoDB 不加索引 1000...

晨曦之光
2012/04/12
2.1K
1
mongoDB 学习笔记纯干货(mongoose、增删改查、聚合、索引、等等)

最后更新时间:2017-07-13 11:10:49 原始文章链接:http://www.lovebxm.com/2017/07/13/mongodb_primer/ MongoDB - 简介 官网:https://www.mongodb.com/ MongoDB 是一个基于分布式文件存储的...

Airship
2018/06/01
0
0
Oracle 的 NoSQL 恶梦 MongoDB

Oracle的NoSQL恶梦MongoDB (暨MongoDB发布2.6版本之际) 这次发布描绘出了一个极具前景的公司或将引领未来超过十年的创新。 By Jack Clark, 8 Apr 2014 翻译:无若 快速崛起的数据库MongoDB...

溪边九节
2014/04/09
10.5K
40
MongoDB 3.0新特性概述

MongoDB 在 2015年3月3日 跳过了 MongoDB 2.8版本,直接在 MongoDB 2.6版本后,发布了MongoDB 3.0版本。 随后在 2015年3月17日 发布了 MongoDB 3.0.1 版本; 在 2015年4月9日发布了 MongoDB ...

xinsir999
2018/05/02
0
0
CentOS7 YUM 安装MongoDB 4.0

简介 MongoDB 是一个基于分布式 文件存储的NoSQL数据库 由C++语言编写,运行稳定,性能高 旨在为 WEB 应用提供可扩展的高性能数据存储解决方案 查看官方网站 MongoDB特点 模式自由 :可以把不...

Elson
2018/12/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

我所遇到的GitLab 502问题的解决

我所遇到的GitLab 502问题的解决 2015年02月11日 20:17:07 wangxicoding 阅读数:51095 标签: gitlab 502 解决 端口冲突 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://bl...

rootliu
22分钟前
2
0
OSChina 周五乱弹 —— 对不起,把你看成绿灯了

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @-冰冰棒- :#今日歌曲推荐# 梁博《男孩 (Live)》居然只有现场版,也是好听cry。 《男孩 (Live)》- 梁博 手机党少年们想听歌,请使劲儿戳(这...

小小编辑
32分钟前
126
3
移植Modbus到STM32F103(2):移植FreeModbus到usart3并运行示例代码

FreeModbus是Modbus的一个被广泛移植的实现。其源码在github,最新版是1.6。 FreeModbus支持Modbus功能码里的0x01~0x06,0x0F~0x11和0x17,对一些功能比如异常诊断和读事件计数等功能码并没有...

Konstantine
今天
3
0
浅谈神经网络(神经网络篇)

背景 之前写过浅谈神经网络基础篇,简单介绍下机器学习这块内容,用于扫盲。本文正式将神经网络,这部分是深度学习的基础。了解完可以掌握强大的机器学习的方法,也可以更好的了解深度学习。...

Uknowzheng
今天
5
0
移动硬盘变为RAW格式后的修复

在Mac上使用自己的移动硬盘结果文件系统格式变为RAW; 在自己windows笔记本上使用chkdsk H: /F进行修复,修复日志如下: C:\Users\mengzhang6>chkdsk H: /F文件系统的类型是 NTFS。卷标是 do...

晨猫
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部