mongodb 简单操作

1.简单说说

mongodb是文档型数据库

mongodb 存储的是Bson —>是json的二进制。

特点,内部执行引擎为js 解释器,把文档存储成 json 结构 ,在查询时转换成js对象,并且可以使用熟悉的js语法操作。

mongodb 与 mysql(关系型数据库)比较:

关系型数据库是结构化的数据,每一行的数据格式是固定的。

文档型数据库,每个文档都有自己独特的数据结构

grid fs:大文件管理。

2 .mongodb 的基本使用

  1. 启动mongodb数据库 mongod –config mongod.cfg
  2. 显示所有数据库 show dbs
  3. 使用指定的集合集 use collectionName (不需要特意创建数据库 他可以自动创建)
  4. 插入数据 db.collectionName .insert({name:’myName’,age:22}) 插入的文档是json的格式。
  5. 插入可以使用js语法 for(i=3;i<100;i++) dbs.collectionName .insert({x:i})
  6. 查询 db.collectionName .find() 参数可以为空 返回所有的信息 会默认创建一个id (——id 全局不能重复)
  7. 查询 db.collectionName .find().skip(3).limit(2).sort({x:1}),skip跳过多少的数据 limit限制查询出多杀数据 sort排序
  8. 更新 db.collectionName.update({x:1},{x:99}) 将1更新为 99
  9. 更新部分字段 db.collectionName .update({z:100},{$set:{y:99}}) 这样 z 与 x 的值不会改变 ,使用上一条的操作 z,x会被覆盖,消失掉。
  10. 更新不存在的数据时 自动创建 db.collectionName.update({x:1},{x:99},true)
  11. 多文档更新 默认多条数据相同 只会更新第一条0( 防止误操作才这样设计的)条件只允许使用 set操作db.collectionName.update({c:1},{$set:{c:2}},false,true),参数1为条件 参数2为改变的值 参数3位upset
  12. 删除数据 db.collectionName.remove({c:2}) 参数必传
  13. 删除集合集 (删除表) db.collectionName.drop()

3.索引

1.查看索引

db.collecation.genIndexes()

2._id 索引

也是默认创建的索引。插入指定的 _id db.collection.insert({ _id:1,name:’hello’}) 查询第一条db.collecion.findOne();

3.单建索引

db.collection.ensureIndex({x:1}) key 的代表方向,1为正向排序,-1为逆向排序 如果文档较多,负载较多, 不能直接使用这个命令创建,创建数据库时创建出来。

4.多键索引

与单建索引创建类似 。 db.collection.insert(x:[1,2,3,4,5]) 结合上面的操作 ,这时会创建出一个多建索引

5.复合索引

查询条件不只有一个时,就需要创建复合索引 插入{x:1,y:2,z:3}–>按照x,y查询 –>创建db.collection.ensureIndex({x:1,y:1}) –>find({x:1,y:2})

6.过期索引

适用于一段时间后失效的数据登录信息 存储日志。创建 db.collection.ensureIndex({time:1},{expireAfterSecondes:10}) 参数expireAfterSecondes单位为秒。参数time为时间类型,如果time是时间数组,会按照最小时间进行删除,因为不能有两个过期时间。过期索引不能试复合索引。删除时间是不精准的,mongodb后台有个60s跑一次的删除进程,而删除也需要时间,所以有误差。

7.全文索引:

对字符串与字符串数组创建全文可搜索的索引 使用场景{author:” ,titile:”,article:”}。每个数据集合只能创建一个全文索引

创建:

db.collection.ensureIndex({key:"text"})
db.collection.ensureIndex({key_1:"text",key_2:"text2"})
db.collection.ensureIndex({"$**":"text"})

查询:

db.collection.find({ \$ text:{\$search:"coffee"}})
db.collection.find({\$text:{\$search:"aa bb cc"}})
db.collection.find({\$text:{\$search:"aa bb -cc"}})
db.collection.find({\$text:{$search:" \ "aa " bb cc "}})

全文索引的相似度:

$meta操作符:{score:{$meta:"textScore"}},写在查询条件后面可以返回 返回结果的相似度 ,再通过sort一起使用,可以达到很好的效果。

全文索引的使用限制:

每次查询,只能指定一个$text查询

$text查询不能出现在$nor查询中

查询中如果包含了$test,hint不再起作用

8.索引属性

创建索引格式:

    db.collection.ensureIndex({param},{param})

    第一个参数是索引的值,其中第二个参数是索引的属性

    **比较重要和常用的属性**

        名字   唯一性  稀疏性  是否定时删除(过期索引)

        自定义 名字 db.collection.ensureIndex({x:1,v:1,s:1},{name:"xvs_index"});

        设置 唯一性 db.collection.ensureLndex({m:1,n:1},{unique:true})

        稀疏性 db.collection.ensureIndex({v:1},{sparse:true}) 

        假设 你创建了x 字段的索引,当你插入一条数据时,并不包含x字段, 默认情况下mongo也会             创建出x字段索引,避免这个种情况就可以使用稀疏索引设置为true。好处狠多,不必为没有使用的索引进行         创建,减少了不必要的磁盘占用空间。 

9.地理位置索引

将一些点的位置存储,创建索引后可以根据位置来进行查找其他点。

(1.子分类:

2d索引,用于存储和查找平面上的点

2d sphere索引用于存储查找球面上的点

(2.查找方式:

1.查找距离某个点一定距离内的点

2.查找包含在某个区域内的点

2D索引:平面地理位置索引

创建方式:db.collection.ensureIndex({w:”2d”})

取值范围:经度[-180,180]纬度[-90,90]

db.location.ensureIndex({w:"2d"}) //创建索引
{ 

  "createdCollectionAutomatically" : true,

  "numIndexesBefore" : 1,

  "numIndexesAfter" : 2,

  "ok" : 1

}

db.location.insert({w:[1,1]})

WriteResult({ "nInserted" : 1 })

db.location.insert({w:[1,2]})

WriteResult({ "nInserted" : 1 })

db.location.insert({w:[3,2]})

WriteResult({ "nInserted" : 1 })

db.location.insert({w:[100,100]})

WriteResult({ "nInserted" : 1 })

db.location.insert({w:[200,200]})//经度超出后会报错

WriteResult({

  "nInserted" : 0,

  "writeError" : {

          "code" : 13027,

          "errmsg" : "point not in interval of [ -180, 180 ] :: caused by :: { _id: ObjectId('5b28a8dadb55746ceb317418'), w: [ 200.0, 200.0 ] }"

  }

})

db.location.insert({w:[180,100]})//纬度超出后不会报错 要避免这种情况

WriteResult({ "nInserted" : 1 })

db.location.remove({w:[180,100]})

WriteResult({ "nRemoved" : 1 })

db.location.insert({w:[180,80]})

WriteResult({ "nInserted" : 1 })

db.location.find({w:{$near:[1,1]}}) $near查询出100个距离查询最近的点

{ "_id" : ObjectId("5b28a8b2db55746ceb317414"), "w" : [ 1, 1 ] }

{ "_id" : ObjectId("5b28a8b5db55746ceb317415"), "w" : [ 1, 2 ] }

{ "_id" : ObjectId("5b28a8bbdb55746ceb317416"), "w" : [ 3, 2 ] }

{ "_id" : ObjectId("5b28a8cfdb55746ceb317417"), "w" : [ 100, 100 ] }

{ "_id" : ObjectId("5b28a91fdb55746ceb31741a"), "w" : [ 180, 80 ] }

db.location.find({w:{$near:[1,1],$maxDistance:10}})//使用$maxDistance 限制距离我最远的距离 

{ "_id" : ObjectId("5b28a8b2db55746ceb317414"), "w" : [ 1, 1 ] }

{ "_id" : ObjectId("5b28a8b5db55746ceb317415"), "w" : [ 1, 2 ] }

{ "_id" : ObjectId("5b28a8bbdb55746ceb317416"), "w" : [ 3, 2 ] }`

查询方式:

1.$near查询:查询距离某个点最近的点

2.$geoWithin查询:查询某个形状内的点

形状的表示:

1.$box:矩形,使用 {$box:[[<x1>,<y1>],[<x2>,<y2>]]}表示



db.location.find({w:{$geoWithin:{$box:[[0,0],[3,3]]}}})

{ "_id" : ObjectId("5b28a8b2db55746ceb317414"), "w" : [ 1, 1 ] }

{ "_id" : ObjectId("5b28a8b5db55746ceb317415"), "w" : [ 1, 2 ] }

{ "_id" : ObjectId("5b28a8bbdb55746ceb317416"), "w" : [ 3, 2 ] }`

2.$center:圆形,使用 {$center:[[<x1>,<y1>],r]}表示



db.location.find({w:{$geoWithin:{$center:[[0,0],5]}}})

{ "_id" : ObjectId("5b28a8b2db55746ceb317414"), "w" : [ 1, 1 ] }

{ "_id" : ObjectId("5b28a8b5db55746ceb317415"), "w" : [ 1, 2 ] }

{ "_id" : ObjectId("5b28a8bbdb55746ceb317416"), "w" : [ 3, 2 ] }`

    3.$polygon:多边形,使用{$polygon:[[<x1>,<y1>],[<x2>,<y2>],[<x3>,<y3>]]}表示



db.location.find({w:{$geoWithin:{$polygon:[[0,0],[0,1],[2,5],[6,1]]}}})

{ "_id" : ObjectId("5b28a8b2db55746ceb317414"), "w" : [ 1, 1 ] }

{ "_id" : ObjectId("5b28a8b5db55746ceb317415"), "w" : [ 1, 2 ] }

{ "_id" : ObjectId("5b28a8bbdb55746ceb317416"), "w" : [ 3, 2 ] }`

使用$geonear查询:

geonear使用runCommand命令进行使用,如下

db.runCommand(

{

    geoNear:<collection>,  //集合名字

    near:[x,y],         //坐标

    minDistance:(对2D索引无效)

    maxDistance:               //对2D有效

    num:                //返回条目

})

使用代码:

`

db.runCommand({geoNear:"location",near:[1,2],maxDistance:10,num:1})

{

  "results" : [

          {

                  "dis" : 0,

                  "obj" : {

                          "_id" : ObjectId("5b28a8b5db55746ceb317415"),

                          "w" : [

                                  1,

                                  2

                          ]

                  }

          }

  ],

  "stats" : {

          "nscanned" : 3,

          "objectsLoaded" : 1,

          "avgDistance" : 0,

          "maxDistance" : 0,

          "time" : 0

  },

  "ok" : 1

}

db.runCommand({geoNear:"location",near:[1,2],maxDistance:10,num:2})

{

  "results" : [

          {

                  "dis" : 0,

                  "obj" : {

                          "_id" : ObjectId("5b28a8b5db55746ceb317415"),

                          "w" : [

                                  1,

                                  2

                          ]

                  }

          },

          {

                  "dis" : 1,

                  "obj" : {

                          "_id" : ObjectId("5b28a8b2db55746ceb317414"),

                          "w" : [

                                  1,

                                  1

                          ]

                  }

          }

  ],

  "stats" : {

          "nscanned" : 32,

          "objectsLoaded" : 2,

          "avgDistance" : 0.5,

          "maxDistance" : 1,

          "time" : 3

  },

  "ok" : 1

}

2dsphere 索引

概念:球面地理位置索引

创建方式:db.collection.ensureIndex({w:”2dphere”})

位置表示方式:

GeoJson:描述一个点,一个直线。多边形等形状。(交叉点什么的都行,就是不会)

格式:{type:”“,coordinates:[ < coordinates>]}

查询方式与2d索引查询类似。

支持$minDistance 与$maxDistance

索引构建情况分析

索引的好处:加快索引相关的查询

索引不好处:增加磁盘空间的消耗,降低写入性能

如何评判当前索引构建情况:

1.mongostat工具,查看mongodb运行状态的程序,使用:mongostat -h 127.0.0.1:27017

字段说明:索引情况:idx miss (没有使用索引)。。。(这个可以再找找其他的意思)

2.profile集合(使用场景测试阶段,刚上线时的试运行阶段)

设置profile级别为2,记录所有的操作。

db.setProfilingLevel(2)。

这是创建出一个 system.profile 文件 查询这个文件得到所有的操作信息。

db.system.profile.find() | db.system.profile.find(10).srot({$natural:-1})

$natural这个自然信息排序 根据-1 ,1分辨正向,逆向

3.日志

使用 verbose,日志详细程度,一个V到五个V不同,V越多,记录的越详细

4.explain分析

10索引总结

不同类型索引的创建和查询

如何评价当前系统的索引构建情况

如何优化mongodb的索引使用

全文索引的使用限制

4.mongodb 安全

1.最安全的是物理隔离 :不现实

2.网络隔离其次

3.防火墙再其次

4.用户名 密码 在最后

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值