mongoDB入门学习及搭建使用

mongoDB优势

1、无数据结构限制

a.没有表结构的概念,每条记录可以有完全不同的结构
b.业务开发方便快捷
c.sql数据库需要事先定义表结构再使用
可同时存储数据如:{name:”小明”,sex:”男”}{name:”小红”,address:”上海”}{name:”小兰”,home:[{“山东”},{“江西”}]}

2、完全的索引支持

a.redis的key-value
b.hbase的单索引,二级索引需要自己实现
单键索引,多键索引:{x:1,y:1}
数组索引:[“apple”,”lemon”]
全文索引:“ i am a litte bird”(暂不支持中文)
地理位置索引:2D

3、方便的冗余和扩展

a.复制集保证数据安全
b.分片扩展数据规模
结构类似于:
mogoDB结构图
自身的分片数据功能具有数据均衡,简单扩容与缩容,提供对数据库的统一访问入口,不需要在应用层分发,显著减少人工成本

4、良好的技术支持

1、完善的文档
2、齐全的驱动支持

linux下编译mongoDB(官网还提供Windows等其他版本)

进入mogoDB源码目录
执行scons all [-j 12]
注:【-j 12】指代cpu核数存在多个的情况下用于加速编译,这里指定cpu 12个
linux下编译mongoDB命令

搭建简单的mongoDB服务

1、首先,创建一个叫做mongodb_simple的目录,进入到目录中
2、创建文件夹:data,用来存储数据库的数据文件
3、创建文件夹:log,用来存储数据库的日志文件
4、创建文件夹:bin,用来存储数据库的可执行文件
5、创建文件夹:conf,用来存储数据库的配置文件
关于创建并编辑mongod.conf配置文件:
######
#指定启动时的监听端口号
port = 12345
#指定mongoDB数据存储的目录可以使用相对路径也可以使用绝对路径
dbpath = data
#指明日志文件的位置,需要指定文件而不是文件夹
logpath = log/mongod.log
#在linux下指定启动后台进程,在Windows下无效
fork = true
######
指定mongoDB配置文件,成功后会显示对应的信息
指定mongoDB配置文件

连接mongoDB服务器

连接方式有两种

1、编译时生成的客户端连接(mongo)

mogobb连接操作
mongoDB数据库连接
连接时出现警告,并提示用numact
可以按照如下命令启动:
numact1 --interleave=all bin/mongod -f conf/mongod.conf
然后再次进行连接:
.bin/mongo 127.0.0.1:12345
终止mongo运行
db.shutdownServer或使用kill尽量不要使用kill -9
2、使用驱动进行连接

mongoDB的基本操作

显示所有数据库
show dbs
选择指定数据库
use imooc
删除指定数据库
db.dropDatabase()
mongo中将一张表成为集合
写入数据,格式为json
db.imooc_collection.insert({x:1})
查看创建的表
show collections
查询条件为空,默认返回所有
db.imooc_collection.find()
插入数据,同时指定id,注:_id必须唯一
db.imooc_collection.insert({x:2,_id:1})
指定条件查询
db.imooc_collection.find({x:1})
使用循环条件进行插入数据
for(i=3;i<100;i++)db.imooc_collection.insert({x:1})
计数查询
db.imooc_collection.find.count()
跳过并限制数量排序查询
db.imooc_collection.find().skip(3).limit(2).sort({x:1})
将x为1的数据更新为999
db.imooc_collection.update({x:1},{x:999})
部分更新操作,修改数据{x:100,y:100,z:100},单独修改y值
db.imooc_collection.update({z:100},{$set:{y:99}})
将一条不存在的数据更新,不存在则不进行任何操作
db.imooc_collection.update({y:100},{y:999})
将一条不存在的数据更新,不存在则插入该数据
db.imooc_collection.update({y:100},{y:999},true)
同时更新多条符合条件的数据
db.imooc_collection.update({c:1},{$set:{c:2}},false,true)
删除指定条件的数据,remove()条件不能为空
db.imooc_collection.remove({c:2})
删除指定表
db.imooc_collection.drop()
查看集合的索引情况
db.imooc_collection.getIndexes()
创建索引,给定正值时表示正向索引,负值表示逆向索引
如果系统负载较重,且有许多已经存在的文档不能使用该命令,应在使用数据库前将索引创建完,否则严重影响数据库性能;索引虽然带来写入的变慢,但查找速度明显变快,因此基本忽略该影响
db.imooc_collection.ensureIndex({x:1})

mongoDB常见查询索引

  • _id索引

    _id索引是绝大多数集合默认建立的索引
    对于每个插入的数据,mongoDB都会自动生成一条唯一的_id字段

  • 单键索引

单键索引是最普通的索引,不会自动创建,索引允许重复创建,重复创建时直接返回成功
db.imooc_collection.ensureIndex({x:1})

  • 多键索引(多键索引与单键索引创建形式相同,区别在于字段的值)

    单键索引:值为一个单一的值,例如字符串,数字或者日期
    多键索引:值具有多个记录,例如数组,前面已经为下面的数组创建多键索引
    db.imooc_collection.insert({x:[1,2,3,4,5]})

  • 复合索引

当我们的查询条件不只有一个时,就需要建立复合索引
对于插入的数据{x:1,y:2,z:3}创建复合索引
db.collection.ensureIndex({x:1,y:1})

  • 过期索引

1、过期索引:是在一段时间后会过期的索引
2、在索引过期后,相应的数据会被删除
3、这适合存储一些在一段时间之后会失效的数据如用户的登录信息、存储的日志
4、建立方法:
db.collection.ensureIndex({time:1},{expireAfterSeconds:10})
过期索引的限制
1、存储在过期索引字段的值必须是指定的时间类型
说明:必须是ISODate或者ISODate数组,不能使用时间戳,否则不能被自动删除
2、如果指定了ISODate数组,则按照最小的时间进行删除
3、过期索引不能是复合索引
说明:不能指定两个过期时间
4、删除时间不是精确的、
说明:删除过程是由后台程序每60s跑一次,而且删除也需要一些时间,所以存在误差

mongoDB全文索引

全文索引:对字符串与字符串数组创建全文可搜索的索引
建立方法(这里的artcles指articles集合):
db.articles.ensureIndex({key:"text"})
db.articles.ensureIndex({key_1:"text",key_2:"text”})
db.articles.ensureIndex({"$**":"text"})

如何使用全文索引
db.articles.find({$text:{$search:"coffee"}})
db.articles.find({$text:{$search:"aa bb cc"}})匹配多个关键词或查询
db.articles.find({$text:{$search:"aa bb -cc"}})排除关键词cc
db.artcles.find({$text:{$search:"\"aa\" bb cc"}})匹配多个关键词与查询

全文相似度查询
$meta操作符:{score:{$meta:”textScore”}}写在查询条件后可以返回返回结果的相似度
与sort一起使用,可以达到很好的实用效果
db.articles.find({$text:{$search:"aa bb"}},{score:{$meta:"textScore"}}).sort({score:{$meta:"textScore"}})
mongoDB全文索引使用限制
每次查询,只能指定一个$text查询
$text查询不能出现在$nor查询中
查询中如果包含了$text,hint不再起作用
mongoDB全文索引不支持中文

索引属性

比较重要的属性:
名字,唯一性,稀疏性,是否定时删除
设置索引名字
db.collection.ensureIndex({},name:"")
指定索引唯一性
db.collection.ensureIndex({},unique:true/false)
指定索引稀疏性(默认情况下,mongoDB是不稀疏索引)
索引稀疏可以将不存在的文档不给予索引有利于减少磁盘占用,增大插入速度
但使用稀疏索引也存在无法查找字段不存在的记录隐患,应当避免这么做。
db.collection.ensureIndex({},sparse:true/false)

地理位置索引

概念;将一些点的位置存储在mongoDB中,创建索引后,可以按照位置来查找其他点

  • 子分类:
    2d索引,用于存储和查找平面上的点
    2dsphere索引,用于存储和查找球面上的点
    查找方式:
    1、查找距离某个点一定距离内的点
    2、查找包含在某个区域内的点

2d索引(平面地理位置索引)

此处location是location集合
创建方式:

db.collection.ensureIndex({w:"2d"})

位置表示方式:

经纬度[经度,纬度]
取值范围:经度[-180,180]纬度[-90,90]
db.location.insert({w,[1,1]})

查询方式:

(1)$near查询:查询距离某个点最近的点
(2)$geoWithin查询:查询某个形状内的点

形状的表示

1、$box:矩形,使用{$box:[[<x1,y1>],[<x2,y2>]]}表示
2、$center:圆形,使用{$center:[[<x1,y1>],r]}表示指定圆心和半径
3、$polygon:多边形,使用{$polygon:[[<x1>,<y1>],[<x2>,<y2>],[<x3>,<y3>]]}表示

形状内的点查找

查找矩形内的点
db.location.find({w:{$geoWithin:{$box:[[0,0],[3,3]]}}})
查找圆内的点
db.location.find({w:{$geoWithin:{$center:[[0,0],5]}}})
查找多边形内的点
db.location.find({w:{$geoWithin:{$polygon:[[0,0],[0,1],[2,5],[6,1]]}}})

geoNear查询

geoNear使用runCommand命令进行使用,常用使用如下:
db.runCommand({geoNear:,near:[x,y],mnDistance:(对2d索引无效),maxDistance:,num:,…})
如:db.runCommand({geoNear:"location",near:[1,2],maxDistance:10,num:2})

2dsphere索引(球面地理位置索引)

创建方式

db.collection.ensureIndex({w:”2dsphere”})

位置表示方式:

GeoJSON:描述一个点,一条直线,多边形等形状

格式;

{type;“”, coordinates:[]}

查询方式:

与2d索引查询方式类似,支持 minDistance m i n D i s t a n c e 与 maxDistance

索引构建情况分析

索引好处

加快索引相关的查询

索引的缺陷

增加磁盘空间消耗,降低写入性能

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

1、mongostat工具
2、profile集合
3、日志
4、explain分析

mongostat

用于查看mongodb运行状态的程序
使用说明:mongostat -h 127.0.0.1:1234


  • 字段解释

inserts:每秒插入数
query:每秒查询数
update:每秒更新数
delete:每秒删除数
getmore:每秒获取更多的数
command:每秒执行命令数
flushes:每秒内存向磁盘刷新数据次数
mapped,vsized,res:mongodb数据 磁盘占据大小和内存占用大小
faults:如果数据没有事先从磁盘加载到内存,需要到磁盘读取。值越大说明效率越低
idx miss 索引没有命中的比率,值越大说明索引创建的越差
qr/qw mongo写队列和读队列情况,值越大,性能越差
ar/aw 当前活跃的客户端的数目
netIn,netOut网卡的流量
conn 当前mongo连接数量

profile(mongo慢查询日志)

tips:db.get…()等一系列命令可以使用tab键补全,或摁两下tab获取提示

db.getPrefilingLevel()获取级别
db.getProfilingStatus()获取详细的状态信息
profile分为3个级别分别为0,1,2
0表示profile关闭不进行任何操作
1表示profile配合slowms做预制,记录所有超过slowms的操作
2表示profile记录任何操作
db.setProfilingLevel(2)设置profile级别为2
db.system.profile.find().sort({$natural:-1}).limit(10)查看记录的system.profile集合,这里排序不是必须的,排序natural自然排序一般按照写入顺序进行排序
mongo的profile
“query”表示查询
“order by”表示排序
“cursorid”游标id
“ntoreturn”返回的数据
“ntoskip”跳过的数
“nsanned”扫描的索引数
“nscannedObjects”扫描的实体数,当扫描索引仍不能确认扫描的数据是需要的时才扫描实体,所以一般nsanned大于等于nscannedObjects
注:当系统开启profile时,系统记录数据比较大,会明显降低系统性能,因此profile使用一般在系统上线阶段或刚上线的调试阶段,生产中不建议使用

mongodb日志

配置mongod.conf中的参数时
verbose级别从一个“v”到五个“v”,
级别越高也就是“v”越多,日志记录详细度越高
会记录连接和操作等信息

explain

可以特定分析某个索引或查询的性能,mills是耗时
db.imooc.find({x:100}).explain()

mongoDB安全

概览

1、最安全的是物理隔离:不现实
2、网络隔离其次
3、防火墙在其次
4、用户名和密码在最后

mongoDB开启权限认证

默认情况下,不开启mongoDB的权限认证
两种方式开启
1、auth开启
在mongod.conf中写入auth等于ture 然后启动或重启mongoDB
在未创建用户的情况下依旧可以连接上mongo,需要创建用户
2、keyfile开启

mongoDB创建用户

1、创建语法:createUser(2.6之前未addUser)
2{user:"<name>",pwd:"<cleartext password>",customData:{<any information>},roles:[{role:"<role>",db:"<database>"}]}
3、角色类型:内建类型(read,readWrite,dbAdmin,dbOwner,useAdmin)
4、db.createUser({user:"imooc",pwd:"imooc",roles:[{role:"userAdmin",db:"admin"},{role:"read",db:"test"}]})

mongoDB用户角色

1、数据库角色(read.readWrite,dbAdmin,dbOwner,userAdmin)
2、集群角色(clusterAdmin,clusterManager…)
3、备份角色(backup,restore…)
4、其他特殊权限(DBAdminAnyDatabase…)
总结来自慕课网mogoDB入门

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值