Python全栈 MongoDB 数据库(数据的修改)

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介:
修改操作符的使用

$set
修改一个域的值,增加一个域

阿哲年龄修改为33
db.class1.update({name:'阿哲'},{$set:{age:33}})

如果sex域不存在则会添加这个域
db.class1.update({name:'阿蓉'},{$set:{sex:'w'}})

$unset
删除一个域

删除sex域
db.class1.update({name:'小陈'},{$unset:{sex:''}})

* 每个操作符可以同时操作多项
db.class1.update({name:'陈'},{$set:{age:36,sex:'m'}})

* 一次修改可以同时使用多个操作符
db.class1.update({name:'阿宝'},{$set:{name:'老王'},$unset:{sex:''}})

$rename
修改域名

将sex域名改为gender
db.class1.update({sex:{$exists:true}},{$rename:{sex:'gender'}},false,true)

$setOnInsert
如果第三个参数为true且插入数据,则表示插入文档的补充内容。如果不插入文档则不起作用

如果插入新文档则setOnInsert中键值对也作为文档内容
db.class1.update({name:'阿文'},{$set:{age:32},$setOnInsert:{gender:'m'}},true)

$inc
加减修改器
db.class1.update({},{$inc:{age:-1}},false,true)

$mul
乘法修改器
db.class2.update({},{$mul:{age:2}},false,true)

* $inc   $mul  参数可以使整数小数正数负数

$min 
如果筛选文档指定域的值小于min值则不修改,大于min值则修改为min值

如果age大于18则修改为18
db.class2.update({},{$min:{age:18}},false,true)

$max
如果筛选文档指定域的值大于max值则不修改,小于max值则修改为max值

将年龄不到30的修改为30
db.class1.update({},{$max:{age:30}},false,true)


数组修改器

$push
向数组中添加一项

向score数组中添加一项
db.class2.update({name:'小亮'},{$push:{score:91}})

$pushAll
向数组中添加多项
db.class2.update({name:'小明'},{$pushAll:{score:[5,10]}})

$pull
从数组中删除一项
db.class2.update({name:'小明'},{$pull:{score:10}})

$pullAll
从数组中删除多项
db.class2.update({name:'小明'},{$pullAll:{score:[58,5]}})

$each  
对多个值进行逐一操作
db.class2.update({name:'小明'},{$push:{score:{$each:[60,10]}}})

$position  
指定插入位置

配合each使用将数据插入到指定位置
db.class2.update({name:'小红'},{$push:{score:{$each:[5],$position:1}}})

$sort  
对数组进行排序

对数组进行排序
db.class2.update({name:'小明'},{$push:{score:{$each:[],$sort:1}}})

$pop 
弹出一项

1表示弹出数组中最后一项,-1表示弹出第一项
db.class2.update({name:'小明'},{$pop:{score:-1}})

$addToSet
向数组中添加一项,但是不允许添加重复内容

如果数组中没有80则添加80
db.class2.update({name:'小红'},{$addToSet:{score:80}})

时间类型

mongodb 中支持时间格式 : ISODate()

1. 使用 new Date() 自动生成当前时间
db.class0.insert({book:'Python入门',date:new Date()})

2. 使用 ISODate() 生成当前时间
db.class0.insert({book:'Python精通',date:ISODate()})

3. 获取计算机时间生成时间格式字符串 Date()
db.class0.insert({book:'Python疯狂',date:Date()})
指定时间:
ISODate()
功能: 生成mongodb时间存储类型
参数: 不加参数生成当前时间
       指定时间格式参数:
       "2018-01-01 12:12:12"
       "20180101 12:12:12"
       "20180101"
db.class0.insert({book:'Python崩溃',date:ISODate("2018-07-13 11:23:36")})

时间戳:
通过当前的时间生成的一个时间节点标志

valueOf()
生成某个标准时间的时间戳
db.class0.insert({book:'Python重生',date:ISODate().valueOf()})

Null 类型:

值 : null  

1. 如果某个域存在却没有值可以设置为null

表示date没有实际意义的值
db.class0.insert({book:'Python编程',date:null})

2. 在查找时可以找到值为null或者不存在某个域的文档

查找到date值为null或者不存在date域的文档
db.class0.find({date:null},{_id:0})

数组的下标操作方式:
可以通过  域名.下标  的方式具体操作数组的某一项

查找数组 0 项大于90的文档
db.class2.find({'score.0':{$gt:90}},{_id:0})

将score 第1项改为10
db.class2.update({name:'小红'},{$set:{'score.1':10}})


内部文档操作(Object):
文档内部某个域的值还是一个文档,则这个文档称为内部文档类型数据

* 通过  外部域.内部文档域  的方式引用内部文档中某个域的值进行操作
db.class3.find({'books.title':'狂人日记'},{_id:0})

db.class3.update({"books.title":'骆驼祥子'},{$set:{"books.price":48.6}})

查找结果的下标引用
可以通过下标的方式获取查找结果的某一项

获取查找结果的 第 2 项
db.class1.find({},{_id:0})[2]


综合示例 : 
使用之前的grade数据库

1.将小红年龄改为8岁,兴趣爱好变为跳舞画画
db.class.update({$set:{age:8,hobby:['dance','draw']}})

2. 追加小明兴趣爱好 唱歌
db.class.update({$push:{hobby:'sing'}})

3. 追加小王兴趣爱好,吹牛,打篮球
db.class.update({$pushAll:{hobby:['吹牛','basketball']}})

4. 小李兴趣多了跑步唱歌,但是要确保不和以前的重复
db.class.update({$addToSet:{hobby:{$each:['running','sing']}}})

5. 将该班所有同学年龄加1
db.class.update({},{$inc:{age:1}},false,ture)

6. 删除小明的sex属性
db.class.update({$unset:{sex:''}})

7.删除小李兴趣中的第一项
db.class.update({$pop:{hobby:-1}})

8,删除小红兴趣中的画画和唱歌
db.class.update({$pullAll:{hobby:['draw','sing']}})

9. 为小红增加一个域,为  score:{english:93,chinese:92,match:78}
db.class.update({$set:{score:{english:93,chinese:92,match:78}}})

10. 给小红数学成绩加5分
db.class.update({$inc:{'score.math':5}})

11. 小明的第一爱好改为computer
db.class.update({$set:{'hobby.0':'computer'}})


索引:
指建立指定键值及所在文档中存储位置的对照清单,
使用索引可以方便我们进行快速查找,减少数据遍历次数,从而提高查找效率

Mongodb 创建索引:
ensureIndex()
功能 : 
创建索引
参数 : 
第一个为对哪个域创建索引
第二个为索引的选项
对name域创建索引
db.class1.ensureIndex({name:1})
* 1表示正向索引  -1表示逆向索引

查看某个集合中的 索引:
db.class1.getIndexes()
* _id是系统为每个集合自动创建的索引

自定义索引名称
通过第二个参数传入索引选项实现
db.class1.ensureIndex({age:1},{name:'ageIndex'})
* 同一个域不能重复创建相同的索引,一个集合中索引名也不要相同

删除索引:
dropIndex()
功能: 
删除一个索引
参数: 
索引名或者索引键值对

db.class1.dropIndex({name:-1})
db.class1.dropIndex("ageIndex")

dropIndexes()
功能:
删除所有索引

删除class1中所有索引,但是不会删除_id索引
db.class1.dropIndexes()

其他索引类型:

复合索引:
同时根据多个域创建一个索引

根据name和age域查询都为索引查询,比单独创建两个索引表更节省空间
db.class1.ensureIndex({name:1,age:-1})


数组和子文档索引:
如果对某个数组和子文档域创建索引,那么根据数组和子文档的查找均为索引查找

如果对score域创建索引则 下面的查找也是索引查找
db.class2.find({'score.0':60},{_id:0})

覆盖索引:
查找操作需要获取的域,只有索引域没有其他域。
此时索引表可以直接提供给用户想要的内容,提高查找效率

唯一索引:
创建的索引,索引域值无重复,此时可以创建唯一索引
唯一索引数据结构更加便于查找

对name创建唯一索引,name值不能有重复
db.class1.ensureIndex({name:1},{ unique:true})

* 当对某个域创建唯一索引,该域就不能再插入重复数据

稀疏索引:
只针对有指定域的文档创建索引表,如果某个文档没有该域则不会插入到索引表中

对age创建稀疏索引
db.class1.ensureIndex({age:1},{ sparse:true})

索引约束:
1. 索引表也需要占用一定的磁盘空间
2. 当数据发生更新时索引表也要随之更新

综上: 
1. 数据量比较大时更适合创建索引,数据量较小时没有必要付出索引代价
2. 频繁进行查找操作而不是更新删除插入操作,此时更适合使用索引


固定集合:
mongodb中可以创建大小固定的集合,称之为固定集合。

特点:  
1.插入速度更快,顺序查找更快
                2.可以控制集合的空间大小
3.能够自动淘汰早期数据

使用: 
日志处理
                临时缓存

创建:
db.createCollection(collection,{capped:true,size:10000,max:1000})
参数:
capped:true:
创建固定集合
size:10000:
    固定集合的大小  字节数
max :1000:
    表示最多多少条文档

创建一个固定集合
db.createCollection('log',{capped:true,size:10000,max:3})

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
13天前
|
存储 人工智能 Cloud Native
云栖重磅|从数据到智能:Data+AI驱动的云原生数据库
在9月20日2024云栖大会上,阿里云智能集团副总裁,数据库产品事业部负责人,ACM、CCF、IEEE会士(Fellow)李飞飞发表《从数据到智能:Data+AI驱动的云原生数据库》主题演讲。他表示,数据是生成式AI的核心资产,大模型时代的数据管理系统需具备多模处理和实时分析能力。阿里云瑶池将数据+AI全面融合,构建一站式多模数据管理平台,以数据驱动决策与创新,为用户提供像“搭积木”一样易用、好用、高可用的使用体验。
云栖重磅|从数据到智能:Data+AI驱动的云原生数据库
|
18天前
|
关系型数据库 MySQL 数据库连接
python脚本:连接数据库,检查直播流是否可用
【10月更文挑战第13天】本脚本使用 `mysql-connector-python` 连接MySQL数据库,检查 `live_streams` 表中每个直播流URL的可用性。通过 `requests` 库发送HTTP请求,输出每个URL的检查结果。需安装 `mysql-connector-python` 和 `requests` 库,并配置数据库连接参数。
116 68
|
15天前
|
SQL 关系型数据库 数据库
国产数据实战之docker部署MyWebSQL数据库管理工具
【10月更文挑战第23天】国产数据实战之docker部署MyWebSQL数据库管理工具
53 4
国产数据实战之docker部署MyWebSQL数据库管理工具
|
12天前
|
关系型数据库 分布式数据库 数据库
云栖大会|从数据到决策:AI时代数据库如何实现高效数据管理?
在2024云栖大会「海量数据的高效存储与管理」专场,阿里云瑶池讲师团携手AMD、FunPlus、太美医疗科技、中石化、平安科技以及小赢科技、迅雷集团的资深技术专家深入分享了阿里云在OLTP方向的最新技术进展和行业最佳实践。
|
19天前
|
关系型数据库 MySQL 数据处理
探索Python中的异步编程:从asyncio到异步数据库操作
在这个快节奏的技术世界里,效率和性能是关键。本文将带你深入Python的异步编程世界,从基础的asyncio库开始,逐步探索到异步数据库操作的高级应用。我们将一起揭开异步编程的神秘面纱,探索它如何帮助我们提升应用程序的性能和响应速度。
|
20天前
|
人工智能 Cloud Native 容灾
云数据库“再进化”,OB Cloud如何打造云时代的数据底座?
云数据库“再进化”,OB Cloud如何打造云时代的数据底座?
|
21天前
|
NoSQL 前端开发 MongoDB
前端的全栈之路Meteor篇(三):运行在浏览器端的NoSQL数据库副本-MiniMongo介绍及其前后端数据实时同步示例
MiniMongo 是 Meteor 框架中的客户端数据库组件,模拟了 MongoDB 的核心功能,允许前端开发者使用类似 MongoDB 的 API 进行数据操作。通过 Meteor 的数据同步机制,MiniMongo 与服务器端的 MongoDB 实现实时数据同步,确保数据一致性,支持发布/订阅模型和响应式数据源,适用于实时聊天、项目管理和协作工具等应用场景。
|
6天前
|
SQL 关系型数据库 MySQL
go语言数据库中mysql驱动安装
【11月更文挑战第2天】
20 4
|
4天前
|
SQL 关系型数据库 MySQL
12 PHP配置数据库MySQL
路老师分享了PHP操作MySQL数据库的方法,包括安装并连接MySQL服务器、选择数据库、执行SQL语句(如插入、更新、删除和查询),以及将结果集返回到数组。通过具体示例代码,详细介绍了每一步的操作流程,帮助读者快速入门PHP与MySQL的交互。
13 1
|
15天前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。同时,文章还对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据需求选择最合适的方法。通过具体案例,展示了编译源码安装的灵活性和定制性。
59 2