关于NoSQL数据库
NoSQL数据库:Not only sql,一般指代非关系型数据库,它的优点是高可扩展性,分布式计算,低成本,灵活架构,半结构化数据,简化关联关系;但是相应的,非关系数据库目前没有标准化,不够直观等等
nosql数据库的分类
- 文档存储
文档型数据库会将数据以文档的形式进行存储,文档是数据库处理信息的基本单位,与传统数据库中的数据段不同,文档可以很长很复杂,一个文档相当于关系数据库中的一条记录。
常见的文档型数据库有MongoDB,CouchDB等
- 列存储
列式数据库是将数据按照列存储到数据库中,不同于 Oracle、MySQL、SQL Server 等行式数据库,这样做的优点是可以降低系统的IO,适合分布式文件系统
常见的列式数据库有Hbase,Cassandra,Hypertable
- 键值存储
键值存储,顾名思义是使用key-value的键值对来存储数据,相当于python当中的字典类型。优点是key作为唯一的标识符,查询速度远大于sql,但相应的,无法进行条件过滤,每次查找都是从头到尾遍历数据,会消耗大量的计算资源
常见的键值数据库有BerkeleyDB,Memcache,redis。其中,Redis是最流行的键值型数据库
- (对象)图存储
图数据库利用的图形理论存储实体之间的关系信息,关系型数据库存储“关系型”数据并不好用,图数据库很好的补充了这部分缺陷
常见的图数据库有Neo4J,Versant
MongoDB简介
MongoDB是一个基于分布式文件存储的NoSQL数据库,是一个C++编写的运行稳定性能高的数据库,也是最像关系型数据库的非关系型数据库
MongoDB基本术语解释
sql术语 | mongodb术语 | 解释 |
---|---|---|
DBMS | DBMS | 数据库管理系统 |
Database | Database | 数据库 |
Table | Collection | 数据库表——集合 |
Row | Document | 数据记录——文档 |
Column | Field | 数据字段——域 |
Index | Index | 索引 |
Table-join | None | 表连接——None |
Primary key | Primary key | 主键 |
数据类型
ObiectID | String | Boolean | Integer | Double | Arrays | Object | Null | Timestamp | Date |
---|---|---|---|---|---|---|---|---|---|
文档id | 字符串 | 布尔值 | 整数 | 浮点数 | 数组或列表 | 嵌入的文档 | 空值 | 时间戳 | 日期时间 |
常规操作
> show dbs #显示当前数据系统下的所有数据库
admin 0.000GB
config 0.000GB
dbs 0.000GB
local 0.000GB
> db #当前用户所在的数据库,如还未进入数据库,显示test
test
> use dbs #进入到对应数据库
switched to db dbs
> db.help() #帮助文档
DB methods:
> db.集合名称.insert({}) # 插入文档
> show tables #显示当前数据库下的所有集合
eletion
hero
> show collections #显示当前数据库下的所有集合
eletion
hero
> db.dropDatabase #删除当前数据库
> db.createCollection("CName") #创建集合
> db.集合名称.drop() # 删除对应的集合
> db.集合名称.find() # 查询对应的集合数据
增加数据
插 入 的 集 合 可 以 存 在 可 以 不 存 在 ! \color{red}{插入的集合可以存在可以不存在!} 插入的集合可以存在可以不存在!
> db.集合名称.inert({}) #插入文档
> db.集合名称.inert([{},{},{}...]) #插入多条文档
> db.hero.insert({name:"翠花",age:21})
> db.hero.insert([{name:"翠花",age:21},{name:"flandre",age:22}])
MongoDB 3.0版本后支持
> db.集合名称.insertOne({}) #默认插入一条
> db.集合名称.insertMany([{},{}...]) #默认插入多条
更新数据
> db.集合名称.update(<query>,<update>,[multi:<boolean>]) #将匹配的值重新覆盖
匹配条件 修改语句 布尔值
multi:默认false更新符合条件第一条,设置true全集合更新
> db.hero.update({name:"zhangsan"},{$set:{age:20}})
# 追加或更新数据,只匹配一条
> db.hero.update({name:"zhangsan"},{$set:{age:20}},{multi:true})
# 匹配多条
updateOne,updateMany必须加$set,否则会报错
> db.hero.updateOne({name:"zhangsan"},{$set:{age:200}})
> db.hero.updateMany({name:"zhangsan"},{$set:{age:200}})
删除数据
> db.集合名称.remove(<query>,{justOne:<boolean>}) #将匹配的值删除
justOne:设置为true或者1,删除一条;默认false删除多条
deleteOne,deleteMany # 匹配成功,只删除一个/全部删除
保存数据
db.集合名称.save() # 如果[_id]数据不存在,添加;不存在则修改
> db.hero.save({name:"flandre"})
> db.hero.save( {"_id" : ObjectId("5fccdc023890083bb925fb5d"),name:"flandre翠花"})
#mMngoDB是支持中文的
查询数据
- 查询语句
db.集合名称.find([文档条件]) # 全集合查询
db.集合名称.findOne([文档条件]) # 查询第一个
Pretty() # 将查询结果格式化展示(只有一个属性时查询结果不变)
> db.hero.find()
> db.hero.find({"name" : "翠花"})
> db.hero.find().pretty()
- 比较运算符(关系运算符):
$lt:小于
$lte:小于等于
$gt:大于
$gre:大于等于
> db.hero.find({age:{$gte:20}})
- 逻辑运算符
逻辑与:与运算,默认操作,无运算符 逻辑或:或运算,$or
db.集合名称.find({$or[{条件一},{条件二}]})
> db.hero.find({$or:[{name:"flandre"},{toolname:"tiansha"}]})
- 范围运算符
$in:判断指定条件是否包含在某个范围内
$nin:
> db.hero.find({age:{$in:[10,20,30,40,50]}})
> db.hero.find({age:{$nin:[10,20,30,40,50]}})
- 正则表达式
/reg/:普通正则表达式
$regex:指定正则表达式
> db.hero.find({name:/^fl/}) # 以fl开头
> db.hero.find({name:/dre$/}) # 以dre结尾
解决以字符串形式书写正则表达式
> db.hero.find({name:{$regex:"dre$"}}) # 以dre结尾
- 自定义条件
$where:通过函数一定义条件[JS函数]
指定函数中,返回boolean类型的值
this表示每个要查询的文档
> db.hero.find({$where:function(){return this.name=="flandre"}})
> db.hero.find({$where:function(){return this.name=="xingxing" || this.age==20}})
- 限制查询条数
<find>.limit(查询条数n) # 查询前n条
<find>.skip(跳过条数n).limit(查询条数m) # 跳过n条查询m条
> db.hero.find().limit(5)
> db.hero.find().skip(3).limit(5)
- 排序
<find>.sort({字段:1/-1,....})
> db.hero.find().sort({age:1}) # 以年龄正序排序(没有年龄数据的默认最小)
> db.hero.find().sort({age:1,_id:-1}) # 年龄相同的以id号倒序
- 统计
> db.hero.count({age:{$gt:10}}) # 统计年龄大于10的
> db.hero.count({toolname:"tiansha"}) # 统计toolname是“tiansha”的
> db.hero.count() # 统计数据条目
10
- 去重
db.集合名称.distinct(“去重域名称”,{条件}) # 去掉重复的数据
> db.hero.distinct("name")
- 投影
投影:查询指定域
find({},{投影字段:1/0}) # 0表示隐藏1表示显示
> db.hero.find({},{name:1}) # 显示所有数据的id
> db.hero.find({},{name:1,_id:0}) # 隐藏id
权限管理
Mongodb默认没有用户,安全性过低,需要创建用户来提高数据库的安全性;mongodb采用角色-用户-数据库的安全管理方式
常用系统角色:
root:只在admin数据库中可用,超级账号,超级权限
Read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
打开cmd开启权限认证:关服务(net stop mongodb),mongod --dbpath xxx --logpath xxx auth install,开启服务(net start mongodb) 必 须 使 用 管 理 员 打 开 c m d \color{red}{必须使用管理员打开cmd} 必须使用管理员打开cmd
- 创建超级管理员
use admin
db.createUser(
{user:‘root’,pwd:‘root’,
roles:[{role:‘root’,db:‘admin’}]}) #配置管理员授权登录
db.auth(“root”,“root”) # 用户登录
- 创建普通用户
use dbs
db.createUser(
{user:‘py’,pwd:‘py’,
roles:[{role:‘readWrite’,db:‘dbs’}]}) #配置用户授权登录
db.auth(“py”,“py”) # 用户登录
修改用户
db.updateUser(‘用户名’,{pwd:‘密码’})
删除用户
db.dropUser(username)
用户授权登录
> db.auth("py","py") # 用户登录
> db.updateUser('用户名',{pwd:'密码'}) # 修改用户
> db.dropUser(username) # 删除用户