数据库之mongodb
1安装
- sudo apt-get inatall -y mongodb-org
- 官网下载
- 解压
tar -zxvf mongodb-linux-x86_64-ubuntu1604-3.4.0.tgz
- 添加到目录中
sudo mv -r mongodb-linux-x86_64-ubuntu1604-3.4.0/ /usr/local/mongodb
- 添加到执行文件中
export PATH=/usr/local/mongodb/bin:$PATH
2基本操作
- 查看参数
mongod --help
- 启动
sudo service mongod start
- 停止
sudo service mongod stop
- 重启
sudo service mongod restart
- 查看进程
ps ajx|grep mongod
- 注:如果通过官网下载启动方式不同
- 直接输入 mongod
sudo mongod --config /usr/local/mongodb/mongodb.config
- 默认端口27017
- 启动本地服务
- mongo
- 退出
- exit / ctrl + c
3基本使用
数据库命令
- 查看数据库名称
- db
- 显示所有数据库
- show dbs
- 切换数据库,数据库在插入数据后自动创建
- use 数据库名称
- 删除数据库
- db.dropDatabase()
集合命令
- 创建集合(也可以不手动创建,插入数据时自动创建)
- name–名称 options–文件 {capped:true,size:10}–上限
db.createCollection(name, options)
db.createCollection("stu")
db.createCollection("sub", { capped : true, size : 10 } )
- 显示当前数据库集合
show collections
- 删除数据库
db.集合名称.drop()
4数据类型
- Object ID:文档ID
- String:字符串,最常用,必须是有效的UTF-8
- Boolean:存储一个布尔值,true或false
- Integer:整数可以是32位或64位,这取决于服务器
- Double:存储浮点值
- Arrays:数组或列表,多个值存储到一个键
- Object:用于嵌入式的文档,即一个值为一个文档
- Null:存储Null值
- Timestamp:时间戳,表示从1970-1-1到现在的总秒数
- Date:存储当前日期或时间的UNIX时间格式
- 语句如下
- mongodb date (ISODate)对应的为Python中的 datetime()
5数据的增删改
数据的插入更新
- 插入
db.集合名称.insert(document)
db.stu.insert({name:'gj',gender:1})
s1={_id:'20160101',name:'hr'}
s1.gender=0
db.stu.insert(s1)
- db.集合名称.save(doucument)
- insert 和 save 区别 insert:如果id存在插入报错 save:id 存在修改 不存在添加
更新
db.集合名称.update(query ,update,{multi: boolean})
把query更新为update,multi默认false(只更新一条)
- 注 update 会完全替换原有字段,指定替换加$set
db.stu.update({name:'hr'},{$set:{name:'hys'}})
删除
db.集合名称.remove(query,{justOne: boolean})
db.stu.remove({name:"xh"})
6数据的查询
基本查询
- db.集合名称.find({条件文档})
- 输出格式化
- db.集合名称.find({条件文档}).pretty()
比较运算符
- 等于,默认是等于判断,没有运算符
- 小于$lt
- 小于或等于$lte
- 大于$gt
- 大于或等于$gte
- 不等于$ne
- db.stu.find({age:{$gte:18}})
逻辑运算符
- 逻辑与:默认是逻辑与的关系
db.stu.find({age:{$gte:18},gender:true})
- 逻辑或:使用$or,值为数组,数组中每个元素为json
db.stu.find({$or:[{age:{$gt:18}},{gender:false}]})
范围运算符
- 使用”
in","
nin” 判断是否在某个范围内
db.stu.find({age:{$in:[18,28]}})
正则表达式
- 使用//或$regex编写正则表达式
- db.stu.find({name:/^黄/})
- db.stu.find({name:{$regex:’^黄’}})
自定义查询
- 使用$where后面写一个函数,返回满足条件的数据
db.stu.find({
$where:function() {
return this.age>30;
}
})
- 可以指定返回的字段 显示{name:1} 不显示{name:0}
db.stu.find({
$where:function() {
return this.age>30;
}
},{name:1})
Limit Skip
- 方法limit():用于读取指定数量的文档
- db.stu.find().limit(2)
方法skip():用于跳过指定数量的文档
- db.stu.find().skip(2)
配合使用,可以达到分页效果
- db.stu.find().skip(5).limit(4)
投影(返回结果只显示必要的字段)
- db.集合名称.find({},{字段名称:1,…})
- db.stu.find({},{_id:0,name:1,gender:1})
排序
- db.集合名称.find().sort({字段:1,…})
- db.stu.find().sort({gender:-1,age:1})
统计个数
- db.集合名称.find({条件}).count()
- db.stu.find({gender:true}).count()
- db.集合名称.count({条件})
- db.stu.count({age:{$gt:20},gender:true})
消除重复
- db.集合名称.distinct(‘去重字段’,{条件})
- 例:查找年龄大于18的学生,来自哪些省份
- db.stu.distinct(‘hometown’,{age:{$gt:18}})
7聚合
- 作为数据计算工具,当前数据的输出作为下一个数据的输入
- db.集合名称.aggregate({管道:{表达式}})
- 管道
- $group:将集合中的文档分组,可用于统计结果
- group字典中有几个键,对应结果有几个键
- 分组依据接在-id后
- 取字段,带$符号
- $match:过滤数据,只输出符合条件的文档
- $project:修改输入文档的结构,如重命名、增加、删除字段、创建计算结果
- $sort:将输入文档排序后输出
- $limit:限制聚合管道返回的文档数
- $skip:跳过指定数量的文档,并返回余下的文档
- $unwind:将数组类型的字段进行拆分
- 表达式
- sum:计算总和, sum:1 表示以一倍计数
- $avg:计算平均值
- $min:获取最小值
- $max:获取最大值
- $push:在结果文档中插入值到一个数组中
- $first:根据资源文档的排序获取第一个文档数据
- $last:根据资源文档的排序获取最后一个文档数据
- $group例
- 例: -id作为分组依据,根据年龄分组,求每组数量
db.stu.aggregate({$group:{_id:'$gender', counter:{$sum:1}}})
- 例: Group by null 求学生总人数、平均年龄
db.stu.aggregate({$group:{_id:null,counter:{$sum:1},avgAge:{$avg:'$age'}}})
- 例:改变输出样式
db.stu.aggregate({$group:{_id:'$gender', counter:{$sum:1}}},{$project:{gender:"$-id",counter:"$counter",-id:0}})
- 例:多字段约束分组去重
db.stu.aggregate({$group:{_id:{country:"country",hometown:"hometown"}}})
- 例: -id作为分组依据,根据年龄分组,求每组数量
- $match例
- 例 查询年龄大于20的男生、女生人数
db.stu.aggregate({$match:{age:{$gt:20}}},{$group:{_id:'$gender',counter:{$sum:1}}})
- 例 查询年龄大于20的男生、女生人数
- $sort例
- 例:查询男生、女生人数,按人数降序
db.stu.aggregate({$group:{_id:'$gender',counter:{$sum:1}}},{$sort:{counter:-1}})
- 例:查询男生、女生人数,按人数降序
limit, skip例
- 例:查询2条学生信息
db.stu.aggregate({$limit:2})
- 例:查询从第3条开始的学生信息
db.stu.aggregate({$skip:2})
- 例:查询2条学生信息
$unwind
- 例:数据字段拆分
db.t2.insert({_id:1,item:'t-shirt',size:['S','M','L']})
db.t2.aggregate({$unwind:'$size'})
- 注:按照size拆分,原本数据没有size,会过滤掉
- 属性preserveNullAndEmptyArrays值为false表示丢弃属性值为空的文档,属性preserveNullAndEmptyArrays值为true表示保留属性值为空的文档
db.inventory.aggregate({
$unwind:{
path:'$字段名称',
preserveNullAndEmptyArrays:<boolean> #防止数据丢失
}})
- 例:数据字段拆分
8创建索引提高查询速度
- 创建数据
for(i=0;i<100000;i++){
db.t1.insert({name:'test'+i,age:i})
}
- 查找姓名为’test10000’的文档
db.t1.find({name:'test10000'})
- 性能分析
db.t1.find({name:'test10000'}).explain('executionStats')
- 建立索引
db.集合.ensureIndex({属性:1})
如
db.t1.ensureIndex({name:1})
- 建立索引后查询
db.t1.find({name:'test10000'}).explain('executionStats')
索引命令
- 建立唯一索引,实现唯一约束的功能
db.t1.ensureIndex({"name":1},{"unique":true})
- 联合索引,对多个属性建立一个索引,按照find()出现的顺序
db.t1.ensureIndex({name:1,age:1})
- 查看文档所有索引
db.t1.getIndexes()
- 删除索引
db.t1.dropIndex('索引名称')
- 建立唯一索引,实现唯一约束的功能
恢复备份
- 备份语法
- mongodump -h dbhost -d dbname -o dbdirectory
- -h:服务器地址,也可以指定端口号
- -d:需要备份的数据库名称
- -o:备份的数据存放位置,此目录中存放着备份出来的数据
- 例1
sudo mkdir test1bak
sudo mongodump -h 192.168.196.128:27017 -d test1 -o ~/Desktop/test1bak
- 恢复语法
- mongorestore -h dbhost -d dbname –dir dbdirectory
- -h:服务器地址
- -d:需要恢复的数据库实例
- –dir:备份数据所在位置
- 例2
mongorestore -h 192.168.196.128:27017 -d test2 --dir ~/Desktop/test1bak/test1