MongoDB
安装
-
官网下载tgz包
-
移动到usr/local/mongodb
-
将可执行文件添加到PATH路径中
export PATH=/usr/local/mongodb/bin:$PATH
-
启动:
sudo mongod --dbpath /var/lib/mongodb
database 基础命令
- 查看当前数据库:db
- 查看所有数据库:show dbs
- 切换数据库:use 数据库名
- 删除当前数据库:db.dropDatabase()
集合基础命令
- 可以不用手动创建集合,使用时向里面插入数据,集合就自动建立了
- 查看集合:
show collections
- 删除集合:
db.集合名.drop()
数据类型
Object ID | ⽂档ID(自动生成) |
---|---|
String | 字符串, 最常⽤, 必须是有效的UTF-8 |
Boolean | 存储⼀个布尔值, true或false |
Integer | 整数可以是32位或64位,这取决于服务器 |
Double | 存储浮点值 |
Arrays | 数组或列表, 多个值存储到⼀个键 |
Object | ⽤于嵌⼊式的⽂档, 即⼀个值为⼀个⽂档 |
Null | 存储Null值 |
Timestamp | 时间戳, 表示从1970-1-1到现在的总秒数 |
Date | 存储当前⽇期或时间的UNIX时间格式 |
数据基本操作
-
插入数据:
db.test1.inster()
- _id:可以自己写,若空则会自动生成一个Object ID
db.test1.save()
- 该方法也可以插入,但如果_id存在,则会更新对应的数据,而inster则会报错,无法插入
-
更新:
db.test1.update(<条件>,内容,{mult:true(全部)|false(一条)})
db.test1.update({name:"范晓昊"},{name:"李二狗"}) # 整条数据都替换成 李二狗 db.test1.update({name:"范晓昊"},{$set:{name:"李二狗"}}) # 只是把name的值替换成 李二狗
-
删除:
db.test1.remove({name:"范晓昊"},{justOne:true}) # 默认是删除全部满足条件的,justOne为true则只删一条
-
查询:
db.test1.find({条件}) db.test1.findOne({条件}) # 只返回一条 db.test1.find.pretty({条件}) # 将结果格式化,美化输出
运算符
-
比较运算符
等于 默认就是 小于 $lt 小于等于 $lte 大于 $gt 大于等于 $gte 不等于 $ne db.test1.find({age:{$gte:18}})
-
范围运算符:
$in
、$nin
db.test1.find({age:{$in:[18,28]}})
-
逻辑运算符
-
and:直接写多个条件即可
db.test1.find({age:{$gte:18},gender:true}) # 查询年龄⼤于或等于18, 并且性别为true的学⽣
-
or:
$or
db.test1.find({$or:[{age:{$gt:18}},{gender:false}]}) # 查询年龄⼤于18, 或性别为false的学⽣ db.test1.find({$or:[{age:{$gte:18}},{gender:true}],name:'小王'}) # 查询年龄⼤于18或性别为男⽣, 并且姓名是小王
-
-
支持正则
# 用 // 或 $regx 编写正则表达式 db.test1.find({name:/^⻩/}) # 查询姓⻩的学⽣ db.test1.find({name:{$regex:'^⻩'}})
limit和skip
-
limit()
用于读取指定数量的文档db.test1.find().limit(2) # 查询两条信息
-
skip()
用于跳过指定数量的文档db.stu.find().skip(2) # 跳过两条数据
-
两个方法可以一起使用,无分先后
投影
-
在查询到返回的结果中,只选择必要的字段
db.集合名称.find({},{字段名称:1,...}) db.stu.find({},{_id:0,name:1,gender:1}) # 字段为1则是显示,0则是不显示,_id默认为1
排序
-
方法
sort()
,用于对集进行排序db.集合名称.find().sort({字段:1,...}) db.stu.find().sort({gender:-1,age:1}) # 参数1为升序排列 参数-1为降序排列
统计个数
-
方法
count()
,用于统计结果集中的文档条数db.集合名称.find({条件}).count() db.集合名称.count({条件}) db.test1.find({gender:true}).count() db.test1.count({age:{$gt:20},gender:true})
消除重复
-
⽅法
distinct()
对数据进⾏去重db.集合名称.distinct('去重字段',{条件}) db.test1.distinct('hometown',{age:{$gt:18}}) # age为18的人的家乡
数据备份与恢复
-
备份
mongodump -h dbhost -d dbname -o dbdirectory mongodump -h 192.168.196.128:27017 -d test1 -o ~/Desktop/test1bak
-h: 服务器地址, 也可以指定端⼝号
-d: 需要备份的数据库名称
-o: 备份的数据存放位置, 此⽬录中存放着备份出来的数据
-
恢复
mongorestore -h dbhost -d dbname --dir dbdirectory mongodump -h 192.168.196.128:27017 -d test1 -o ~/Desktop/test1bak
聚合 aggregate
-
聚合(aggregate)是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成的管道,可以对每个阶段的管道进行分组、过滤等功能,然后经过一系列的处理,输出相应的结果。
db.集合名称.aggregate({管道:{表达式}})
-
在MongoDB中,文档处理完毕后,通过管道进行下一次处理
-
常用管道:
$group 将集合中的⽂档分组, 可⽤于统计结果 $match 过滤数据, 只输出符合条件的⽂档 $project 修改输⼊⽂档的结构, 如重命名、 增加、 删除字段、 创建计算结果 $sort 将输⼊⽂档排序后输出 $limit 限制聚合管道返回的⽂档数 $skip 跳过指定数量的⽂档, 并返回余下的⽂档 $unwind 将数组类型的字段进⾏拆分 -
表达式:处理文档并输出
语法:
表达式:'$列名'
常用表达式:
$sum 计算总和,$sum:1表示以⼀倍计数 $avg 计算平均值 $min 获取最⼩值 $max 获取最⼤值 $push 在结果⽂档中插⼊值到⼀个数组中 $first 根据资源⽂档的排序获取第⼀个⽂档数据 $last 根据资源⽂档的排序获取最后⼀个⽂档数据 -
$group
-
将集合中的文档分组,可用于统计结果
-
_id表示分组的依据,使用某个字段的格式为’$字段’
-
统计男生、女生的总人数
db.test1.aggregate( {$group: { _id:'$gender', counter:{$sum:1} } } )
-
-
$match
-
查询年龄大于20的
db.test1.aggregate( {$match: { age:{$gt:20} } } )
索引
- 创建
-
可提升查询速度
db.test1.ensureIndex({"name":1})
放入多个属性可以建立联合索引,属性值1为升序
加上
{"unique":true}
可建立唯一索引,可以消除重复
-
-
查看当前索引
db.test1.getIndexes()
-
删除索引
db.t1.dropIndex('索引名称')
-
pymongo
-
pip安装
-
使用
from pymongo import Mongoclient # 首先实例化client,建立连接 client = Mongoclient(host='127.0.0.1',port=27017) collection = client['test']['t001'] # 前者为数据库名,后者为集合名 collection.insert({'name':'范晓昊','age':18})
END…