目录
MongoDB介绍:
MongoDB是⼀个介于关系数据库和⾮关系数据库之间的产品,是⾮关系数据库当 中功能最丰富,最像关系数据库的。它⽀持的数据结构⾮常松散,因此可以存储 ⽐较复杂的数据类型。Mongo最⼤的特点是它⽀持的查询语⾔⾮常强⼤,其语法 有点类似于⾯向对象的查询语⾔,⼏乎可以实现类似关系数据库单表查询的绝⼤ 部分功能,⽽且还⽀持对数据建⽴索引。
SQL和NoSQL的主要区别:
在SQL中层级关系:数据库->表->数据
在NoSQL中是:数据库->集合->数据
优势:
1.⽆数据结构限制 :没有表结构的概念,每条记录可以有完全不同的结构 ,业务开发⽅便快捷
2.⼤数据量和⾼性能 :nosql数据库都具有⾮常⾼的读写性能,尤其在⼤数量下表现优秀
3.良好的⽀持 完善的⽂档 ⻬全的驱动⽀持。
业务应用场景:传统的关系型数据库(如MySQL),在数据操作的"三⾼"需求以及应对Web2.0的 ⽹站需求⾯前,显得⼒不从⼼。
"三⾼"需求:
High performance - 对数据库⾼并发读写的需求。
Huge Storage - 对海量数据的⾼效率存储和访问的需求。
High Scalability && High Availability- 对数据库的⾼可扩展性和⾼可⽤性的需 求。
具体的应⽤场景如:
1)社交场景,使⽤ MongoDB 存储存储⽤户信息,以及⽤户发表的朋友圈信息, 通过地理位置索引实现附近的⼈、地点等功能。
2)游戏场景,使⽤ MongoDB 存储游戏⽤户信息,⽤户的装备、积分等直接以内 嵌⽂档的形式存储,⽅便查询、⾼效率存储和访问。
3)物流场景,使⽤ MongoDB 存储订单信息,订单状态在运送过程中会不断更 新,以 MongoDB 内嵌数组的形式来存储,⼀次查询就能将订单所有的变更读取 出来。
4)物联⽹场景,使⽤ MongoDB 存储所有接⼊的智能设备信息,以及设备汇报的 ⽇志信息,并对这些信息进⾏多维度的分析。
5)视频直播,使⽤ MongoDB 存储⽤户信息、点赞互动信息等。
特点:
(1)数据量⼤
(2)写⼊操作频繁(读写都很频繁)
(3)价值较低的数据,对事务性要求不⾼ 对于这样的数据,我们更适合使⽤MongoDB来实现数据的存储。
MongoDB在Ubuntu中安装:
在Linux中安装MongoDB :
- sudo apt-get install mongodb
- 开启服务 sudo service mongodb start
- 关闭服务 sudo service mongodb stop
- 重启服务 sudo service mongodb restart
运⾏MongoDB
1.把MongoDB的bin⽬录加⼊到环境变量中 2.执⾏命令
mongod --dbpath C:\Program Files\MongoDB\Server\4.4\data # 启动
连接MongoDB:
在环境变量设置好的前提下,使⽤以下命令 mongo 就可以进⼊到mongo的操作终 端了
查看帮助命令:
mongo -help
MongoDB概念介绍:
SQL概念 | MongoDB概念 | 解释 |
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 字段/域 |
index | index | 索引 |
primary key | primary key | 主键 |
MongoDB三元素:
- ⽂档:就是关系型数据库中的⼀⾏。⽂档是⼀个对象,由键值对构成,是json的扩 展形式
{"name": "abc", "gender": 1}
- 集合:就是关系型数据库中的表。可以存储多个⽂档,结构可以不固定。
{"name": "abc", "gender": 1}
{"name": "abc", "age": 18}
{"title": "abc", "price": 1}
3.数据库
mongoDB中数据库的基本使用
查看数据库 :show dbs
切换数据库 :use 数据库
查看当前的数据库: db
删除数据库 :db.dropDatabase()
会⾃动创建数据库: use 数据库
查看集合:show tables/show collections
MongoDB中集合的基础命令
不⼿动创建集合,向不存在的集合中第⼀次加⼊数据时,集合会被创建出 来。
⼿动创建集合 : db.createCollection(name,options)
- name: 要创建的集合名称
- options: 可选参数, 指定有关内存⼤⼩及索引的选项
db.createCollection('sub',{capped:true,size:10})
- 参数capped:默认值为false表示不设置上限,值为true表示设置上限
- 参数size:当capped值为true时,需要制定此参数。表示上限⼤⼩,当⽂档达到 上限时,会将之前的数据覆盖,单位为字节
查看集合:show collections
删除集合:db.集合.drop()
MongoDB的数据类型
- String:字符串,必须是有效的UTF-8
- Boolean:存储⼀个布尔值,true或者false
- nteger:整数可以是32位或64位,这取决于服务器
- Double:存储浮点数 Arrays:数组或列表
- Object:嵌⼊式⽂档
- Null:存储Null值
- Timestamp:时间戳, 表示从1970-1-1到现在的总秒数
- Object ID是⼀个12字节的⼗六进制数
数据库命名规范
1.不能是空字符串
2.不得含有特殊字符
3.应全部⼩写
4.最多64个字节
5.数据库名不能与现有系统保留库同名,如admin,local
mongoDB插⼊数据
db.集合名.insert({}) 数据格式为json,id不能重复,⽀持多条插⼊数据库
单条插⼊数据:
db.jerry_collection.insert({x:1})
多条插⼊数据:
for(i=3;i<10;i++)db.jerry3.insert({x:i})
mongodb的保存
命令: db.集合名称.save(document)
db.stu.save({_id:ObjectId("5f169b37d74866264ed9a7db"), name:'gj',
gender:2})
db.stu.save({name:'gj', gender:2})
db.stu.find()
mongodb查询数据
查询所有数据:
db.jerry_collection.find({条件⽂档})
⽅法pretty():将结果格式化:
db.集合名称.find({条件⽂档}).pretty()
查询单条数据:
db.jerry_collection.findOne({条件⽂档})
带有条件的查询:
查询x等于100的数据
db.jerry_collection.find({x:100})
查询x等于100,y等于99的
db.jerry_collection.find({x:100,y:99})
⽐较运算符 | 等于:默认是等于判断,没有运算符 ⼩于:$lt ⼩于等于:$lte ⼤于:$gt ⼤于等于:$gte 查询y⼤于等于18的数据 db.jerryn_collection.find({y:{$gte:18}} |
范围运算符 | 使⽤$in,$nin判断是否在某个范围内查询年龄为18、28的学⽣ db.jerry_collection.find({age:{$in:[18,28]}}) |
逻辑运算 | or:使⽤$or,值为数组,数组中每个元素为json db.jerry_collection.find({$or:[{age:{$gt:18}},{gender:false}]}) |
⾃定义查询:
- mongo shell 是⼀个js的执⾏环境
- 使⽤$where 写⼀个函数, 返回满⾜条件的数据
查询年龄⼤于30的学⽣
db.jerry_collection.find({
$where:function() {
return this.age>30;}})
查出的数据求总数:
db.jerry_collection.find().count()
limit和skip
limit⽤于读取指定数量的⽂档
db.jerryn_collection.find().limit(2)
skip⽤于跳过指定数量的⽂档
db.jerry_collection.find().skip(2)
limit和skip同时使⽤
db.jerry_collection.find().skip(2).limit(2)
映射:
指定返回的字段,如果为1则返回改字段,如果为0则除了改字段外所有字段返回。 id如果没写会默认返回
db.jerry_collection.find({},{_id:1})
排序:
按照年龄升序排序
db.jerry_collection().find().sort({age:1})
按照年龄降序排序
db.jerry_collection().find().sort({age:-1})
修改数据
db.集合名称.update({query}, {update}, {multi: boolean})
参数query:查询条件
参数update:更新操作符
参数multi:可选,默认是false,表示只更新找到的第⼀条数据,值为true表示 把满⾜条件的数据全部更新
db.jerry_collection.insert({x:100,y:100,z:100})
{ "_id" : ObjectId("59b297dd8fa0c171faae5bc8"), "x" : 100, "y" : 100, "z"
: 100 }
db.jerry_collection.update({x:100},{y:99})
修改后数据变为
{ "_id" : ObjectId("59b297dd8fa0c171faae5bc8"), "y" : 99 }
部分更新
db.jerry_collection.update({x:100},{$set:{y:99}})
如果y:100数据不存在,就插⼊y:101这条数据,第三个参数为true
db.jerry_collection.update({y:100},{y:101},true)
更新多条
db.jerry_collection.update({y:99},{$set:{y:101}},{multi:true})
删除数据
db.jerry_collection.remove({条件},{justOne:true}) mongoDB为了防⽌误删除,条
件必须写
db.jerry_collection.remove() 删除所有数据,索引不会删除
db.jerry_collection.remove({x:100})
删除表
db.jerry_collection.drop()
聚合
聚合是基于数据处理的聚合管道,每个⽂档通过⼀个由多个阶段组成的管道,可 以对每个阶段的管道进⾏分组、过滤等功能,然后经过⼀系列的处理,输出相应 的结果
常⽤的管道:
$group:将集合中的⽂档分组,可⽤于统计结果
_id表示分组的依据,使⽤某个字段的格式为 '$字段'
1.按照gender分组
db.students.aggregate(
{$group:{_id:'$gender',count:{$sum:1}}})
2.按照gender分组,获取不同组的平均年龄
db.students.aggregate(
{$group:{_id:'$gender',count:{$sum:1},avg_age:{$avg:"$age"}}}
)
$match:过滤数据,只输出符合条件的⽂档,可将结果交给后一个管道
查询年龄⼤于20的学⽣
db.students.aggregate(
{$match:{age:{$gt:20}}}
)
查询年龄⼤于20的男⽣,⼥⽣⼈数
db.students.aggregate(
{$match:{age:{$gt:20}}},
{$group:{_id:'$gender',count:{$sum:1}}}
)
$sort:将输⼊⽂档排序后输出
$limit:限制聚合管道返回的⽂档书
$skip:跳过指定数量的⽂档,并返回余下的⽂档
常用表达式:
$sum: 计算总和,
$sum:1 表示以⼀倍计数
$avg: 计算平均值 $min: 获取最⼩值
$max: 获取最⼤值
$push: 在结果⽂档中插⼊值到⼀个数组中
$first: 根据资源⽂档的排序获取第⼀个⽂档数据
$last: 根据资源⽂档的排序获取最后⼀个⽂档数据
Mongodb创建索引
mongodb创建简单的索引⽅法
语法: db.集合名.ensureIndex({属性:1}) ,1表示升序, -1表示降序
创建索引前后查询速度对⽐
1.插⼊数据
for(i=0;i<100000;i++){db.test.insert({name:'test'+i,age:i})
2.创建索引前
db.test.find({name:'test9999'})
db.test.find({name:'test9999'}).explain('executionStats') # 显示查询操作的详
细信息
3.创建索引
db.test.ensureIndex({name:1})
4. 创建索引后
db.test.find({name:'test9999'}).explain('executionStats')
索引的查看
默认情况下_id是集合的索引 查看⽅式: db.集合名.getIndexes()
删除索引
db.test.dropIndex({name:1})
db.test.getIndexes()
Mongodb和Python的交互
1.pymongo安装
pip install pymongo
2.连接数据库
⽅式⼀
client = MongoClient()
⽅式⼆ 指定端⼝和地址
client = MongoClient('localhost',27017)
3.新增数据
from pymongo import MongoClient
from datetime import datetime
class TestMongo(object):
def __init__(self):
self.client = MongoClient('mongodb://localhost:27017/')
# 也可以指定连接的集合client['admin']['students']
self.db = self.client['admin']
# print(self.client.database_names())
def add_one(self):
post = {'title':'标题','content':'内
容','created_at':datetime.now()}
# db.students students 是表明
res = self.db.students.insert_one(post)
return res
def add_more(self):
data_list = [{"name":"test{}".format(i)} for i in range(5)]
res = self.db.students.insert_many(data_list)
return res
mongo = TestMongo()
res = mongo.add_one()
插⼊的ID
print(res.inserted_id)
4.查询数据
from bson.objectid import ObjectId
查询⼀条数据
def get_one(self):
return self.db.students.find_one()
查询多条数据
def get_more(self):
return self.db.students.find()
根据记录的ID查询数据
def get_from_id(self,id):
return self.db.students.find_one({'_id':ObjectId(id)})
查询⼀条数据
res = mongo.get_one()
查询多条数据
res = mongo.get_more()
for i in res:
print(i)
根据记录的ID查询数据
res = mongo.get_from_id('5b83e8a1b594c32e8c70c1f7')
print(res)
5.修改数据
修改单条数据
def update(self):
res = self.db.students.update_one({'title':'标题'},{'$set':
{'title':'title-2'}})
# 匹配的数据条数
print(res.matched_count)
# 影响的数据条数。
print(res.modified_count)
修改多条
def update_more(self):
res = self.db.students.update_many({},{'$set':{'x':1}})
print(res.matched_count)
print(res.modified_count)
res = self.db.students.update({'x':2},{'$set':{'x':3}},True)
res = mongo.update()
res = mongo.update_more()
6.删除数据
删除⼀条
def delete_one(self):
res = self.db.students.delete_one({'title':'title-2'})
print(res.deleted_count)
删除多条
def delete_more(self):
res = self.db.students.delete_many({'x':2})
print(res.deleted_count)
res = mongo.delete_one()
res = mongo.delete_more()