MongoDB的优势
1.易扩展,这也是非关系数据库共有的优势
2.大数据量,高性能,非常高的读写性能
3.灵活的数据模型,无需事先为要存储的数据建立字段
MongoDB的安装
1.pip install mongodb
2. 启动:sudo service mongod start 或者 sudo mongod --config /usr/local/mongodb/mongodb.conf
3.停止:sudo service mongod stop
4.重启:sudo service mongod restart
5.查看是否启动成功:ps ajx|grep mongod
6.配置文件的位置:/etc/mongod.conf
7.默认端口:27017
8.日志的位置:/var/log/mongodb/mongod.log
数据库的命令
1.查看当前的数据库:db
2.查看所有的数据库:show dbs
3.切换数据库:use 数据库名字
4.删除当前的数据库:db.dropDatabase()
集合的命令
1.不手动创建集合:行不存在的集合中第一次加入数据时,集合会被创建出来
2.手动创建集合:db.createCollection(name,options)
例如:db.createCollection('sub',{capped:true,size:10})
参数capped:默认为false表示不设置上限
参数size:指定文档上限,单位为字节,托超过上限,会将前面的文档覆盖
3.查看集合:show collections
4.删除集合:db.集合名字.drop()
数据类型
1.Object ID:文档ID
2.String:字符串,最常用
3.Boolean:存储一个布尔值,true或false
4.Integer:整数可以是32位或64位
5.Double:存储浮点值
6.Object:用于嵌入式的文档,即一个值为一个文档
7.Null:存储Null值
8.Timestamp:时间戳,表示从1970-1-1到现在的总秒数
9.Date:存储当前日期或时间的UNIX时间格式
10.创建日期语句如下:参数的格式为YYYY-MM-DD
new Date('2020-01-01')
11.每个文档都有一个属性:_id 保证每个文档的唯一性
可以自己去设置_id插入文档,如果没有提供,那么MongDB为每个文档提供一个独特的_id,类型为objectID
插入
1.db.集合名字.insert(document)
例如:db.stu.insert({_id:'20200101',name:'gj',gender:1})
保存
db.集合名字.save(document)
如果文档的_id已经存在则修改,不存在则添加
查询
db.集合名字.find()
更新
db.集合名称.update(<query>,<update>,{multi:<boolean>})
query:查询条件
update:更新操作符
multi:可选,默认是false,表示只更新找到的第一条记录,值位true表示把满足条件的文档全部更新
例如:db.stu.update({name:'hr'},{name:'mnc'}) 更新一条,把全部内容替换
db.stu.update({name:'hr'},{$set:{name:'mnc'}}) 更新一条,指定一个键对应的值
db.stu.update({},{$set:{gender:0}},{multi:true}) 更新全部
删除
db.集合名字.remove(<query>,{justOne:<boolean>})
query:删除文档的条件
justOne:设置为ture或1,则只删除一条,默认false,表示删除多条
比较运算符
等于:默认是等于,没有运算符
小于:$it
小于等于:$ite
大于:$gt
大于等于:$gte
不等于:$ne
例如:db.stu.find({age:{$lte:18}})
范围运算符
$in,$nin判断是否在某个范围内
例如:db.stu.find({age:{$in:[18,28,38]}})
逻辑运算符
and:并且,和
db.stu.find({age:{$gte:18},gender:true})
or:使用$or,值为数组
db.stu.find({$or:[{age:{$gt:18}},{gender:false}]})
高级查询
1.db.集合名字.find({文档条件})
2.db.集合名字.findone({文档条件}) 只返回一条
3.db.集合名字.find({条件文档}).pretty() 将结果格式化输出
4.支持正则表达式:使用//或$regex编写
例如:db.products.find({sku:/^abc/})
db.products.find({sku:{$regex:'789$'}})
5.limit:用于读取指定数量得文档
例如:查询2条学生信息
db.stu.find().limit(2)
6.skip:用于跳过指定数量得文档
db.stu.find().skip(2)
可以同时使用db.stu.find().limit(3).skip(2)
7.自定义查询
使用$where后面写一个函数,返回满足条件得数据查询年龄大于30得学生
db.stu.find({$where:function(){return this.age>30;}})
8.投影:在查询到得返回结果中,只选择必要得字段db.集合名字.find({},{字段名称1,...})
参数为字段与值,值为1表示显示,值为0不显,特殊:对于_id列默认是显示得,如果不显示需要明确设置为0
例如:db.stu.find({},{_id:0,name:1,gender:1})
9.排序:方法sort(),用于对集进行排序
db.集合名称.find().sort({字段:1,...})
参数1为升序,-1为降序
例如:根据性别降序,在根据年龄升序
db.stu.find().sort({gender:-1,age:1})
10.统计个数:方法count()
db.集合名字.find({条件}).count()
db.集合名字.count({条件})
db.stu.find({gender:ture}).count()
db.stu.count({age:{$gt:20},gender:true})
数据备份和恢复
数据备份
mongodump -h dbhost -d dbname -o dbdirectory
-h:服务器地址,也可以指定端口号
-d:需要备份的数据库名称
-o:备份的数据存放位置,此目录中存放着备份出来的数据
数据恢复
mongorestore -h dbhost -d dbname --dir dbdirectory
-h:服务器地址
-d:需要恢复的数据库实例
--dir:备份数据所在位置
聚合命令
聚合是基于数据处理的聚合管道,每个文档通过一个由多个阶段组成的管道,可以对每个阶段的管道进行分组,过滤等功能,然后经过一系列的处理,输出相应的结果
db.集合名称.aggregate({管道:{表达式}})
常用管道命令
1.$group:将集合中的文档分组,可用于统计结果
注意:1.$group对应的字典中有几个键,结果中就有几个键
2.分组依据需要放到'_id'后面
3.取不同的字段的值需要使用$,如'$age'
4.取字典嵌套的字典中的值的时候’$_id.country‘
5.能够同时按照多个键进行分组’{$grop:{_id:{country:'$country',province:'$province'}}}‘
结果是’{_id:{country:'',province:''}}‘
按照gender进行分组,获取不同数据的个数和平均年龄
db.stu.aggregate({$group:{_id:'$gender',count:{$sum:1},avg_age:{$avg:'$age'}}})
使用$group统计整个文档
db.stu.aggregate({$group:{_id:null,count:{$sum:1},mean_age:{$avg:'age'}}})
2.$match:过滤数据,只输出符合条件的文档
3.$project:修改输入文档的结构,如重命名,增加,删除字段,创建计算结果
db.stu.aggregate({$group:{_id:null,count:{$sum:1},mean_age:{$avg:'age'}}},{$project:{gender:'%_id',count:1,'avg_age':1,_id:0}})
4.$sort:将输入文档排序后输出
例如:查询男生,女生人数,并且按照降序排序
db.stu.aggregate{{$group:{_id:'$gender',counter:{$sum:1}}},{$sort:{counter:-1}}}
5.$limit:限制聚合管道返回的文档数
6.$skip:跳过指定数量的文档,并返回余下的文档
7.$unwind:将数组类型的字段进行拆分
表达式
语法:表达式:'$列名'
1.$sum:计算总和,$sum:1 表示以一倍计数
2.$avg:计算平均值
3.$min:获取最小值
4.$max:获取最大值
5.$push:在结果文档中插入值到一个数组中
6.$first:根据资源文档的排序获取第一个文档数据
7.$last:根据资源文档的排序获取最后一个文档数据
索引
语法:db.集合.ensureindex({属性:1}),1表示升序,-1表示降序
例如:db.t1.ensureindex({name:1})
在默认情况下索引字段的值可以相同
创建唯一索引(索引的值是唯一的):
db.t1.ensureIndex({'name':1},{'unique':true})
建立联合索引
db.t1.ensureIndex({name:1,age:1})
查看当前集合的所有索引:
db.t1.getIndexes()
删除索引:
db.t1.dropIndex('索引名称')
mongodb和python间交互
from pymongo import Mongoclient
client = MongoClient(host='127.0.0.1',port=27017)
collection = client['test']['t251']
插入一条数据
ret1 = collection.insert({'name':'xiaoming','age':18})
插入多条数据
data_list = [{'name':'test{}'.format(i)} for i in range(10)]
colletion.insert_many(data_list)
查询一个记录
t =collection.find_one({'name':'xiaowang'})
查询多条记录
collection.find({'name':'xiaowang'})
更新一条数据
collection.update_one({'name':'xiaowang'},{$set:{'name':'xiaohong'}})
更新全部数据
collection.update_many({'name':'xiaowang'},{'$set':{'name':'xiaohong'}})
删除一条
collection.delete_one({'name':'xiaowang'})
删除所有条件满足的数据
collection.delete_many({'name':'xiaowang'})