文章目录
认识MongoDB
- 由c++编写,是一个基于分布式文件存储的开源数据库
- 面向文档存储的数据库,操作很方便
MongoDB的优势
- 易扩展:数据之间没有关系,比较容易扩展
- 大数据量,高性能,数据库结构简单
- 灵活的数据模型
安装
sudo apt-get install -y mongodb
启动
- 启动:sudo service mongodb start
- 停止:sudo service mongodb stop
- 重启:sudo service mongodb restart
- 默认:27017
客户端
- 启动命令:mongo
- 查看帮助:mongo -help
- 退出:
将数据存储为一个文档,文档类似于json格式,字段值可以包含其他文档
{
name:“潘俊廷”,
‘age’:18,
‘address’:{city:‘长沙’,country:‘china’}
}
MongoDB | MySQL |
---|---|
集合 | 表table |
文档 | 行 |
字段 | 列 |
一、库,集合的操作
1、查看所有库
- show dbs
2、系统库介绍
- admin root数据库
- local 本地数据库,用来存储权限本身服务器的数据
- config 用于分片设置
3、切换数据库
- use dbname 有则使用,无则创建
- 查看数据库的大学:db.stars()
- 删除数据库:db.dropDatabase()
3、集合操作
-
创建集合:db.createCollection(name,options)
-
显示当前数据库的所有集合:show collections,show tables
-
查看集合:db.name.find().pretty()
-
删除集合:db.name.drop()
注意大小写
集合只有插入内容后才会被创建
二、 文档操作
每条数据就是一document,一条json数据
插入数据
# 插入数据
db.student.insert({
'name':'panjunting',
'age':18,
'sex':'male',
'course':['db','django','spider']
}]
# 自定义id插入
db.student.insert({
'_id':2,
'name':'panjunting',
'age':18,
'sex':'male',
'course':['db','django','spider']
}]
# 插入多条数据
db.student.insertMany([
{'name':'zhangsan','age':38,'sex':'man'},
{'name':'lisi','age':33},
{'name':'wangwu','age':3}
])
# 先写字典再插入数据
data_info = {
name:'xiaoming'.
age:12,
sex:'male',
height:1.92
}
db.second.insert(data_info)
查询数据
# 查询数据
db.student.find({'name':'zhangsan'}) 查询满足条件的数据
select * from student where name="zhangsan"
# 年龄小于20岁
db.student.find({'age':{$lt:20}})
# 年龄大于20岁
db.student.find({
$where.function(){
return this.age>20;
}
})
#
db.student.find({'age':{$gt:16}$for:[{'course':'db'},{'sex':'man'}]})
# 查询结果显示
# 排序,sort,-1为降序,1为升序
# 年龄降序排列
db.student.find().sort({'age':-1})
# skip跳过几个显示
# limit允许显示几个
# 跳过一条数据显示两条数据
db.student.find().skip(1).limit(2)
# 查询条件
$lt : 小于
$gt :大于
$ne :不等于
$gte :大于等于
$lte :小于等于
修改数据
# 修改操作
query:update(查询条件)
# 修改‘zhangsan’为‘haha’
db.student.update({'name':'zhangsan'},{$set:{'name':'haha'}})
# 修改‘zhangsan’的年龄为40
db.student.update({'name':'zhangsan'},{$set:{'age':40}})
删除数据
# 删除
db.collection.remove(
<query>, # 匹配,删除文档的条件
<justone> #指定为TRUE,只删除一个文档
)
db.student.remove({'name':'lisi'})
# remove方法过时了,推荐使用deleteone()或者deleteMany()方法
db.student.deleteOne({'name':'dema'})
db.student.deleteMany({'age':38})
三、分组聚合
聚合是基于数据的聚合管道,每个文档由一个或多个阶段组成的管道,可以对每个阶段进行分组/过滤等功能
- _id表示分组依据,按照哪个字段进行分组
# 语法 db.dbname.aggregate({管道:{表达式}})
$group 将集合中的文档分组,可以统计结果
$match 过滤数据,只输出符合条件的文档
$sort 排序
$limit 限制返回的文档数
$skip 跳过指定数量的文档,返回余下的文档
# 表达式
$sum 计算总和
$avg 计算平均值
$min 最小值
$max 最大值
$push 在结果文档里插入值的数组中
案例
# 案例:统计学生平均年龄
db.stu.aggregate(
[{$group:{
_id:null,
avg_age:{$avg:'$age'} 统计age字段的平均值
}
}]
(
# _id表示分组依据,按照哪个字段进行分组
# 案例:学生最大年龄
db.stu.aggregate(
[{$group:{
_id:null, 表示不指定分组字段,即统计整个文档
max_age:{$max:'$age'}
}
}]
(
# 按字段'name'分组
db.stu.aggregate(
[{$group:{
_id:'name',
couter:{$sum:1} 表示把每条数据作为1进行统计
}
}]
(
# 统计姓名
db.stu.aggregate(
[{$group:{
_id:null,
name:{$push:'$name'}
}
}]
(
# 取出年龄大于20的学生
db.stu.aggregate(
$match:{age:{$gt:20}
})
四、python操作MongoDB
MongoDB索引操作
# 批量创建2000条数据
for (var index = 0; index < 2000;index++){
db.abcd.insert({
_id:index,
name:'name'+index,
age:index
})
}
# 统计数量
db.abcd.find().count()
# 显示最后一条数据
db.abcd.find().skip(1999)
# 显示数据详情
db.abcd.find().explain('executionStats')
# 查看索引
db.abcd.getIndexes()
# 删除索引
db.abcd.dropIndex('name_1')
db.time.getIndexes()
五、把MongoDB操作方法封装成类
from pymongo import MongoClient
class MongoData(object):
def __init__(self):
self.client = MongoClient(host='127.0.0.1',port=27017)
self.db = self.client['students']
self.tab = self.db['tea']
def insert_many(self,dict_list):
res = self.tab.insert_many(dict_list)
return res
def finds(self, data, **kwargs):
res1 = self.tab.find()
def deletes_one(self,data):
re = self.tab.delete_one(data)
return re.deleted_count
def updates(self,sel_data,set_data):
"""修改一条数据"""
res = self.tab.update_many(sel_data,set_data)
return res
if __name__ == '__main__':
mongos = MongoData()
dict_data = [
{'name':'Peter','age':29,'pro':'music'},
{'name':'Steve','age':23,'pro':'math'},
{'name':'Susan','age':22,'pro':'English'},
{'name':'David','age':26,'pro':'Chinese'},
{'name':'Angle','age':23,'pro':'piano'}
]
mongos.insert_many(dict_data)
mongos.updates({'name':'Peter'},{'$set':{'name':'monkey'}})
mongos.finds({'name':'David'}) # 查询语句