python learning notes(拾壹)

目录

 

MongoDB介绍:

SQL和NoSQL的主要区别:

优势:

"三⾼"需求:

具体的应⽤场景如:

特点:

运⾏MongoDB

 连接MongoDB:

MongoDB概念介绍: 

 MongoDB三元素:

mongoDB中数据库的基本使用

MongoDB中集合的基础命令

MongoDB的数据类型

数据库命名规范

mongoDB插⼊数据

 mongodb的保存

 mongodb查询数据

limit和skip

映射:

 排序:

 修改数据

 删除数据

 删除表

 聚合

常⽤的管道:

常用表达式:

Mongodb创建索引

Mongodb和Python的交互

1.pymongo安装

 2.连接数据库

3.新增数据

4.查询数据

 5.修改数据

 6.删除数据


 

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 :

  1. sudo apt-get install mongodb
  2. 开启服务 sudo service mongodb start
  3. 关闭服务 sudo service mongodb stop
  4. 重启服务 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概念解释
databasedatabase数据库
tablecollection数据库表/集合
rowdocument数据记录行/文档
columnfield字段/域
indexindex索引
primary keyprimary key主键

 MongoDB三元素:

  1. ⽂档:就是关系型数据库中的⼀⾏。⽂档是⼀个对象,由键值对构成,是json的扩 展形式
    {"name": "abc", "gender": 1}
  2. 集合:就是关系型数据库中的表。可以存储多个⽂档,结构可以不固定。
{"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()

 聚合

聚合是基于数据处理的聚合管道,每个⽂档通过⼀个由多个阶段组成的管道,可 以对每个阶段的管道进⾏分组、过滤等功能,然后经过⼀系列的处理,输出相应 的结果

41a009a51ce6067cacfd2eafbb0398a5.png

常⽤的管道:

$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()

 

CSDN

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值