MongoDB学习笔记

2019-11-27  本文已影响0人  python与数据分析

mongo属于nosql非关系数据库。

一、关系与非关系数据库区别:

1、数据和数据之间不存在关系,每条数据独立个体存在字典之中;
2、mysql扩展性差,大数据量下IO压力大,表结构更改困难;
3、mongo易扩展,大数据量高性能(读写),灵活的数据模型(无需事先为要存储的数据建立字段),高可用;
4、mongo占硬盘空间大

二、mongo基础命令
查看当前数据库:db
查看所有数据库:show dbs
切换数据库:use 库名
删除当前数据库:db.dropDatabase()(db表示当前数据库)
自动创建数据库和集合(相当于mysql的表),不需要手动创建,插入文档(相当mysql中的记录)时自动创建
手动创建数据库和集合:db.createCollection("集合名")
查看集合:show collections
删除集合:db.集合名称.drop()
三、mongo存储数据类型
image.png
四、mongo增删改查
1、增
image.png
*注:
db.集合名称.save(ducument)
如果文档id已存在,则修改,如果不存在则添加
2、查
查询所有数据:db.集合名.find() 
查询一条数据:db.集合名.findone({键:值}).pretty()
等于 :默认是等于判断,没有运算符
小于:$It
小于等于:$Ite
大于:$gt
大于等于:$gte
不等于:$ne
eg:
  db.集合名.find({age:{$gte:18}})
①判断是否在某个范围内
使用$in, $nin
eg:
  db.集合名.find({age:{$in:[18,28,38]}})
②多个条件同时:and
eg:
  db.集合名.find({age:{$gte:18},gender:true})
③条件之间是或的关系:$or
eg:
  db.集合名.find({$or:[{age:{$gte:18}},{gender:true}]})
  db.集合名.find({$or:[{age:{$gte:18}},{gender:true}],name:'zs'})
④支持正则表达式
匹配以abc开头的:
db.集合名.find({sku:/^abc/})
匹配以789结尾的:
db.集合名.find({sku:{$regex:'789$'}})
⑤limit,skip
limit:用于读取指定数量的文档
skip:用于跳过是定数量的文档(相当于翻页)
eg:
  db.集合名.find().skip(2).limit(2)
⑥投影
从查询到的返回结果中,只选择必要的字段
值为1表示显示,0表是不显示(一般不用写),_id是默认显示的  
eg:
  db.集合名.find({},{字段名称:1,_id:0}) 
⑦排序 sort()
db.集合名.find().sort(字段:1,……)
参数1:升序
参数-1:降序
⑧统计个数 count
两种方式:
db.集合名.find({条件}).count()
db.集合名.count({条件})
⑨去重 distinct
db.集合名.distinct('去重字段',{条件})
db.集合名.count({条件})
3、改
image.png
*注:
尽量用$set,代表指定键值,如果不指定,会替代原来所有的字段
4、删
image.png

五、数据的备份与恢复

备份:
mongodump -h dbhost -d dbname -o dbdirectory
-h 服务器地址 ,也可以指定端口号
-d 需要备份的数据库名称
-o 备份的数据存放位置,此目录存放着备份出来的数据
恢复:
mongorestore -h dbhost -d dbname -o dbdirectory
-h 服务器地址 ,也可以指定端口号
-d 需要恢复的数据库实例
-o 备份的数据所在的位置

五、聚合

聚合是基于数据处理的聚合管道(管道:前一次结果交给下一次使用),每个文档通过一个由多个阶段组成的管道,可以对每个阶段的管道进行分组,过滤等功能,然后经过一系列的处理,输出相应的结果。

db.集合名称.aggregate({管道:{表达式}})
常用管道如下:
$group:将集合中的文档分组,可用于统计结果
$match:过滤数据,只输出符合条件的文档
$project:修改输入文档的结构,如重命名、增加、删除字段、创建计算结果
$sort:将输入文档排序后输出
$limit:限制聚合管道返回的文档数
$skip:跳过指定数量的文档,并返回余下的文档
$unwind:将数据类型的字段进行拆分
image.png

实例数据如下(集合名为excle):

image.png
#1、 按部门分组,并求出各部门人数
 db.excle.aggregate({$group:{_id:"$部门",count:{$sum:1}}})
image.png
#2、 将上图结果中的_id更改为'部门',并将_id隐藏
 db.excle.aggregate({$group:{_id:"$部门",count:{$sum:1}}},{$project:{部门:"$_id",count:1, _id:-1}})
image.png
#3、 工龄在一年及以上,各部门人数
db.excle.aggregate({$match:{工龄:{$gte:"1"}}},{$group:{_id:"$部门",count:{$sum:1}}},{$project:{_id:0,部门:"$_id",count:1}})
image.png
注意:
1、$group对应的字典中有几个键,结果中就有几个键
2、 分组依据需要放到'_id'后面
3、取不同字段的值需要使用$,$age

六、索引

索引:以提升查询速度

db.集合名.ensureIndex({属性:1})
1表示升序,-1表示降序
image.png

数据去重:使用数据库建立关键字段的唯一索引进行去重
通过多个字段判断数据的唯一性:主要用到联合索引

上一篇下一篇

猜你喜欢

热点阅读