Mongodb使用
模式自由:可以把不同结构的文档存储在同一个数据库里
面向集合的存储:适合存储json风格文件的形式
完整的索引支持:对任何属性可索引
复制和高可用性:支持服务器之间的数据复制,支持主从模式及服务器
常用的NoSQL常用的四大类:
redis: 键值型(键值数据库是形式最简单的NoSQL,数据中每一个值都有专门的键值对匹配,)
Mongodb: 文档型(文档数据库以类似文档的结构存储数据,可以采用无模式的形式,数据要求不严格,表结构可变)
HBase: 列存储(以列簇式存储,将同一列数据存在一起,在处理大数据集的时候,就可以具备更高的性能和扩展性)
Ne04J:图形(类似于图的结构存储数据,可以利用图结构相关算法,便于探索数据之间的联系)
NoSQL的缺点:
1:不支持SQL语句:不支持SQL支持,学习和使用成本高
2:提供的功能有限:无事务处理,完整的解决方案和报表等支持不好
3:稳定性:产品的完善程度和稳定性,不能和几十年历史的关系型数据库相提并论
SQL术语/概念 | MongoDB术语/概念 | 描述 |
database | database | 数据库 |
table | collection | 数据库表/集合 |
column | field | 数据库属性/字段(域) |
row | document | 数据记录行/文档 |
index | index | 索引 |
primary key | primary key | 主键,MongoDB默认自动将_id字段设置为主键,可以手动设置 |
Mongodb数据库基本命令:
查看当前数据库: db
查看所有数据库名称,列出所有在物理上存在的数据库: show dbs
切换数据库,如果数据库不存在也并不创建,直接插入数据或创建集合时数据库才创建:use 数据库名称
删除当前数据库,如果数据库不存在,则什么也不做: db.dropDatabase()
db.createCollection(name,options) name是要创建的集合的名称,option是一个文档,选项参数是可选的,所以需要到指定的集合名称
不限制集合大小:db.createCollection("stu")
限制集合大小:
capped:默认为false表示不设置上限,值为true表示设置上限
参数size单位是字节,当capped为true时,才设置
db.createCollection("stu",{capped:true,size:6142800})
查看当前数据库的集合: show collections
删除命令:db.stu.drop()
MongoDB中常用的几种数据类型:
ObjectID:文档ID
String:字符串,最常用,必须是有效的UTF-8
Boolean:存储一个布尔值,true或false
Integer:整数可以是32位或64位,这取决于服务器
Double:存储浮点值
Arrays:数组或列表,多个值存储到一个键
Null:存储Null值
Timestamp:时间戳,表示从1970-1-1到现在的秒数
Date:存储当前日期或时间的UNIX时间格式
创建日期语句如下:注意参数的格式YYYY-MM-DD
Date('2017-12-20')
ObjectID:
_id是一个12字节的十六进制数,保证每一份文件的唯一性:
前4个字节为当前时间戳,之后3个字节的机器ID,接下来的2个字节MongoDB的服务进程id
剩余3个字节是简单的增量值
接下来的2个字节的MongoDB的服务进程id
剩余3个字节是简单的增量值
一个字节等于2位十六进制(一位十六进制的数等于四位二进制的数,一个字节等于8位二进制数)
插入:如果不指定_id参数,MongoDB会为文档分配一个唯一的ObjectID
方法一:db.stu.insert({name:'gj',gender:1)
方法二:s1={_id:'20160101',name:'hr'}
s1.gender=0
db.stu.insert(s1)
简单查询:db.集合名称.find()
更新语法: db.集合名称.update(<query>,<update>,{multi:<boolean>})
query:查询条件,类似sql语句update中的where
update:更新操作符.类似sql语句update中的set部分
multi:可选,默认为false,表示只更新找到的第一条记录,值为true表示把满足条件的文档全部更新
全文档更新:db.stu.update({name:'hr'},{name:'nmc'})
指定属性更新,通过操作$set
db.stu.insert({name:'hr',gender:0})
db.stu.update({name:'hr'},{$set:{name:'hys'}})
修改多条匹配到的数据:
db.stu.update({},{$set:{gender:0}},{multi:true})
保存: db.集合名.save(document)如果文档的_id已经存在则修改,如果文档的_id不存在则添加
db.stu.save({_id:'20160102','name':'yk',gender:1})
db.stu.save({_id:'20160102','name':'wyk'})
删除: db集合名称.remove(
<query>,
{
justOne:<boolean>
}
)
参数query:可选,删除的文档的条件
参数justOne:可选,如果设为true或1,只删除一条,默认false,表示删除多条
只删除匹配的第一条: db.stu.remove({gender:0},{justOne:true})
全部删除:db.stu.remove({})
创建示例数据:
创建集合stu,文档的属性包含:_id,name,hometown,age,gender
示例如下:
db.stu.drop()
db.stu.drop()
db.stu.insert({_id : 1, name:'郭靖',hometown:'蒙古',age:20,gender:tr
ue})
db.stu.insert({_id : 2, name:'⻩蓉',hometown:'桃花岛',age:18,gender:
false})
db.stu.insert({_id : 3, name:'华筝',hometown:'蒙古',age:18,gender:fa
lse})
db.stu.insert({_id : 4, name:'⻩药师',hometown:'桃花岛',age:40,gende
r:true})
db.stu.insert({_id : 5, name:'段誉',hometown:'⼤理',age:16,gender:tr
ue})
db.stu.insert({_id : 6, name:'段王爷',hometown:'⼤理',age:45,gender:
true})
数据查询
1.基本查询
find():查询全部符合条件数据 db.集合名称.find({条件文档})
db.stu.find({age:18})
方法findOne():查询,只返回第一个
db.集合名称.findOne({条件文档})
db.stu.findOne({age:18})
方法pretty():将结果格式化
db.集合名称.find({条件文档}).pretty()
db.stu.find({age:18}).pretty()
比较运算符
小于:$lt 小于或等于:$lte 大于:$gt 大于或等于:$gte 不等于 $ne
查询年龄大于或等于18的学生: db.stu.find({$gte:18}})
逻辑运算符
默认是逻辑与的关系
db.stu.find({age:{$gte:18},gender:true}
逻辑或:使用or
查询年龄大于18,或性别为0的学生
db.stu.find({$or:[{age:{$gt:18}},{gender:true}]})
and和or一起使用
查询大于18或性别为0的学生,并且学生的姓名为gj
db.stu.find({$or:[{age:{$gt:18}},{gender:true}],name:'gj'})
范围运算符
使用$in,$nin 判断是否在某一个范围内
查询年龄为18,28的学生
db.stu.find({$age:{$in:[18,28]}})
支持正则表达式
使用/ /或regex编写正则表达式
查姓黄的学生
db.stu.find({name:/^黄/})
db.stu.find({name:{$regex:'^黄'}})
自定义查询
使用$where后面写一个函数,返回一个满足条件的数据
查询年龄大于30的学生
db.stu.find({$where:function(return this.age>30)})
limit():用于指定数量的文档
db.集合名称.find().limit(数值) 未指定参数则显示集合中的所有文档
查询2条学生信息
db.stu.find().limit(2)
skip(): 用于跳过指定数量的文档
db.集合名称.find().skip(数值) 默认是0
查询从第3条学生开始查
db.stu.find().skip(2)
skip()和limit()可以一起使用,不分先后顺序
创建数据集:
for(i=0;i<15;i++){db.nums.insert({_id:i})}
查询第5至8条数据
db.nums.find().limit(4).skip(5)
投影:
在查询到的返回结果中,只选择必要的字段,而不是选择一个文档的整个字段
如:一个文档有5个字段,需要显示3个,投影其中3个字段即可
语法:
参数为字段与值,值1为显示,值为0不显示
db.集合名称.find({},{字段名称:1,........})
对于需要显示的字段,设置为1即可,不设置即为不显示
对于_id列默认是显示的,如果不需要显示明确设置为0
db.stu.find({},{name:1,gender:true})
db.stu.find({},{_id:0,name:1,gender:true})
排序:sort()用于对结果集进行排序
db.集合名称.find().sort({字段:1,.....})
参数为1为升序排列
参数为-1为降序排列
根据性别降序,,再根据年龄升序
db.stu.find().sort({gender:-1,age:1})
统计个数count()用于统计结果集中文档条数
db.集合名称.find({条件}).count()
也可以为: db.stu.count({条件})
db.stu.find({gender:1}).count()
db.stu.count({age:{$gt:20}},gender:true})
消除重复
方法distinct()对数据进行去重
db.集合名称.distinct('去重字段',{条件})
db.stu.distinct('hometown',{age:{$gt:18}})
聚合aggregate
聚合主要用于计算数据,类似sql中的sum(),avg()
语法:
db.集合名称.aggregate([{管道:{表达式}}])