java连接mongodb_第78天: Python 操作 MongoDB 数据库介绍

022572492998419591e3aa198c2c9632.png

MongoDB 是一款面向文档型的 NoSQL 数据库,是一个基于分布式文件存储的开源的非关系型数据库系统,其内容是以 K/V 形式存储,结构不固定,它的字段值可以包含其他文档、数组和文档数组等。其采用的 BSON(二进制 JSON )的数据结构,可以提高存储和扫描效率,但空间开销会有些大。今天就为大家简单介绍下在 Python 中使用 MongoDB 。

安装 PyMongo 库

在 Python 中操作 MongoDB ,需要使用 PyMongo 库,执行如下命令安装:

pip3 install pymongo

连接 MongoDB 数据库

连接时需要使用 PyMongo 库里面的 MongoClient 模块,有两种方式可以创建连接,默认只需要传入IP和端口号即可。如果数据库存在账号密码,则需要指定连接的数据库,并进行鉴权才能连接成功。

#导入 MongoClient 模块from pymongo import MongoClient, ASCENDING, DESCENDING# 两种方式#1. 传入数据库IP和端口号mc = MongoClient('127.0.0.1', 27017)#2. 直接传入连接字串mc = MongoClient('mongodb://127.0.0.1:27017')# 有密码的连接# 首先指定连接testdb数据库db = mc.testdb# 通过authenticate方法认证账号密码db.authenticate('username','password')# 检查是否连接成功,输出以下结果表示连接成功print(mc.server_info())# {'version': '4.2.1', 'gitVersion': 'edf6d45851c0b9ee15548f0f847df141764a317e', 'modules': [], 'allocator': 'tcmalloc', 'javascriptEngine': 'mozjs', 'sysInfo': 'deprecated', 'versionArray': [4, 2, 1, 0], 'openssl': {'running': 'OpenSSL 1.1.1  11 Sep 2018', 'compiled': 'OpenSSL 1.1.1  11 Sep 2018'},  ……省略 ,  'ok': 1.0}

MongoDB 数据库操作

成功连接数据库,接下来我们开始介绍通过 MongoClient 模块如何对 mongoDB 数据库进行 CURD 的操作。

获取数据库和集合

首先要指定需要操作的数据库和集合,这里的数据库可以对应为 MysqlDataBase,集合对应为 MysqlTable。需要注意的是在 mongoDB 中,不需要提前创建数据库和集合,在你操作它们时如果没有则会自动创建,但都是延时创建的,在添加 Document 时才会真正创建。

# 指定操作数据库的两种方式#1. 获取 testdb 数据库,没有则自动创建db = mc.testdb#2. 效果与上面 db = mc.testdb 相同db = mc['testdb']# 打印出testdb数据库下所有集合(表)print(db.collection_names())# 指定操作集合的两种方式#1. 获取 test 集合,没有则自动创建collection = db.test#2. 效果与 collection = db.test 相同collection = db['test']# 打印集合中一行数据print(collection.find_one())

数据的插入操作

在 MongoDB 中,每条数据其实都有一个 _id 属性作为唯一标识。如果没有显式指明该属性,MongoDB 会自动产生一个 ObjectId 类型的 _id 属性,insert() 方法会在执行后返回 _id 值。不过在 PyMongo 3.x 版本中,官方已经不推荐使用 insert() 方法,而是推荐使用insert_one()insert_many() 方法来分别插入单条记录和多条记录。

# 要插入到集合中的对象book = {      'name' : 'Python基础',      'author' : '张三',      'page' : 80}# 向集合中插入一条记录collection.insert_one(book)# 返回结果:{'_id': ObjectId('5de4c7b90ae08431839ac2a7'), 'name': 'Python基础', 'author': '张三', 'page': 80}# 对于insert_many()方法,我们可以将数据以列表形式传递参数book1 = {      'name' : 'Java基础',      'author' : '李白',      'page' : 100}book2 = {      'name' : 'Java虚拟机',      'author' : '王五',      'page' : 100}# 创建 book_list 列表book_list = [book1, book2]# 向集合中插入多条记录collection.insert_many(book_list)# 返回结果:

数据的查询操作

查询需要使用 find_one()find() 方法,其中 find_one() 查询得到的是单个结果,即一条记录,find() 则返回一个生成器对象。下面我们就来查询上面刚插入的数据,如果查询不到数据则返回 None ,代码如下:

# 通过条件查询一条记录,如果不存在则返回Noneres = collection.find_one({'author': '张三'})print (res)# 打印结果:{'_id': ObjectId('5de4c7b90ae08431839ac2a7'), 'name': 'Python基础', 'author': '张三', 'page': 80}# 通过条件查询多条记录,如果不存在则返回Noneres = collection.find({'page': 100})print (res)#打印结果:# 使用 find() 查询会返回一个对象# 遍历对象,并打印查询结果for r in res:   print(r)#打印结果:# {'_id': ObjectId('5de4c8ae0ae08431839ac2a8'), 'name': 'Java基础', 'author': '李白', 'page': 100}# {'_id': ObjectId('5de4c8ae0ae08431839ac2a9'), 'name': 'Java虚拟机', 'author': '王五', 'page': 100}# 查询page大于50的记录res = collection.find({'page': {'$gt': 50}})# 通过遍历返回对象,结果如下:# {'_id': ObjectId('5de4c7b90ae08431839ac2a7'), 'name': 'Python基础', 'author': '张三', 'page': 80}# {'_id': ObjectId('5de4c8ae0ae08431839ac2a8'), 'name': 'Java基础', 'author': '李白', 'page': 100}# {'_id': ObjectId('5de4c8ae0ae08431839ac2a9'), 'name': 'Java虚拟机', 'author': '王五', 'page': 100}

上面查询条件中我们用到了 $gt 的比较运算符,关于查询条件中的比较运算符和功能运算符对照表如下:

符号含义举例
$gt大于{'page': {'$gt': 50}
$lt小于
$lte小于等于
$gte大于等于
$ne不等于
$in在范围内{'page': {'$in': [50, 100]}}
$nin不在范围内{'page': {'$nin': [50, 100]}}
$regex匹配正则表达式{'name': {'$regex': '^张.*'}}
$exists属性是否存在{'name': {'$exists': True}}
$type类型判断{'name': {'$type': 'string'}}
$mod数字模操作{'page': {'$mod': [80, 10]}}
$text文本查询{'$text': {'$search': 'Java'}}
$where高级条件查询{'$where': 'obj. author == obj. full_name'}

数据的更新操作

更新操作和插入操作类似,PyMongo 提供了两种更新方法,即 update_one()update_many() 方法,其中 update_one() 方法只会更新满足条件的第一条记录。

注意:

  • 如果使用 $set,则只更新 book 对象内存在的字段,如果更新前还有其他字段,则不更新也不删除。
  • 如果不使用 $set,则会把更新前的数据全部用 book 对象替换,如果原本存在其他字段则会被删除。
# 查询一条记录book = collection.find_one({'author': '张三'})book['page'] = 90# 更新满足条件{'author', '张三'}的第一条记录res = collection.update_one({'author': '张三'}, {'$set': book})# 更新返回结果是一个对象,我们可以调用matched_count和modified_count属性分别获得匹配的数据条数和影响的数据条数。print(res.matched_count, res.modified_count)#打印结果:1 1# 更新满足条件 page>90 的所有记录,page 字段自加 10res = collection.update_many({'page': {'$gt': 90}}, {'$inc': {'page': 10}})# 打印更新匹配和影响的记录数print(res.matched_count, res.modified_count)#打印结果:2 2book3 = {'name':'Python高级', 'author':'赵飞', 'page': 50}#upsert=True表示如果没有满足更新条件的记录,则会将book3插入集合中res = collection.update_one({'author': '赵飞'}, {'$set': book3}, upsert=True)print(res.matched_count, res.modified_count)#打印结果:0 0# 查询所有记录,并遍历打印出来res = collection.find()for r in res:   print(r)#打印结果:# {'_id': ObjectId('5de4c7b90ae08431839ac2a7'), 'name': 'Python基础', 'author': '张三', 'page': 90}# {'_id': ObjectId('5de4c8ae0ae08431839ac2a8'), 'name': 'Java基础', 'author': '李白', 'page': 110}# {'_id': ObjectId('5de4c8ae0ae08431839ac2a9'), 'name': 'Java虚拟机', 'author': '王五', 'page': 110}# {'_id': ObjectId('5de4d76f71aa089d58170a92'), 'author': '赵飞', 'name': 'Python高级', 'page': 50}

集合的删除操作

删除数据同样推荐使用两个方法 delete_one()delete_many() ,其中 delete_one() 为删除第一条符合条件的记录。具体操作代码如下:

# 删除满足条件的第一条记录result = collection.delete_one({'author': '张三'})# 同样可以通过返回对象的 deleted_count 属性查询删除的记录数print(result.deleted_count)# 打印结果:1# 删除满足条件的所有记录,以下为删除 page < 90 的记录result = collection.delete_many({'page': {'$lt': 90}})print(result.deleted_count)# 打印结果:1

其他数据库操作

除了以上标准的数据库操作外,PyMongo 还提供了以下通用且方便的操作方法,比如 limit() 方法用来读取指定数量的数据skip() 方法用来跳过指定数量的数据等,具体请看如下代码:

# 查询返回满足条件的记录然后删除result = collection.find_one_and_delete({'author': '王五'})  print(result)# 打印结果:{'_id': ObjectId('5de4c8ae0ae08431839ac2a9'), 'name': 'Java虚拟机', 'author': '王五', 'page': 110}# 统计查询结果个数# 全部结果个数collection.find().count()# 返回结果:1# 满足条件结果个数collection.find({'page': 100}).count()# 返回结果:0# 查询结果按字段排序# 升序results = collection.find().sort('page', ASCENDING)# 降序results = collection.find().sort('page', DESCENDING)# 下面查询结果是按page升序排序,只返回第二条记录及以后的两条结果results = collection.find().sort('page', ASCENDING).skip(1).limit(2)print(results)

注意:在数据量在在千万、亿级别庞大的时候,查询时最好 skip() 的值不要太大,这样很可能导致内存溢出。

数据索引操作

默认情况下,数据插入时已经有一个 _id 索引了,当然我们还可以创建自定义索引。

# unique=True时,创建一个唯一索引,索引字段插入相同值时会自动报错,默认为Falsecollection.create_index('page', unique= True)# 打印结果:'page_1'# 打印出已创建的索引print(collection.index_information())# 返回结果:{'_id_': {'v': 2, 'key': [('_id', 1)], 'ns': 'testdb.test'}, 'page_1': {'v': 2, 'unique': True, 'key': [('page', 1)], 'ns': 'testdb.test'}}# 删除索引collection.drop_index('page_1')#删除集合collection.drop()

总结

本文为大家介绍了 Python 中如何创建连接 MongoDB 数据库,并通过代码的方式展示了对 MongoDB 数据的增删改查以及排序索引等操作,通过以上学习个人感觉操作起来还是比较简单方便的。今天就先介绍到这里,以后还会为大家介绍其他数据库的操作。

参考

PyMongo 文档:https://pymongo.readthedocs.io/en/stable/

示例代码:https://github.com/JustDoPython/python-100-day

系列文章第77天:Python 操作 SQLite第76天:Python Scrapy 模拟登陆第75天:Python 操作 Redis 数据库介绍第74天:Python newspaper 框架第73天:itchat 微信机器人简介第72天:PySpider框架的使用第71天:Python Scrapy 项目实战从 0 学习 Python 0 - 70 大合集总结PS:公号内回复 :Python,即可进入Python 新手学习交流群,一起100天计划!-END-Python 技术关于 Python 都在这里6de017f1324dc23850de799497ef4817.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246116.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

URP中的2D Light光照在移动端不生效的问题

最近在尝试用URP推出的还在preview阶段的2D Render系统&#xff0c;发现2D光照在打成APK后失效&#xff0c;尝试了些方法后发现把2d光照用到的shader放进设置中的built in shader后可以解决问题&#xff1a;

大连开发区取暖费能微信支付吗_下半年教资报考人数增加,那到底能不能异地报考呢?...

想要每周获取两篇群文件快扫码进群吧~因为教师资格证认定的问题&#xff0c;最近教师资格证备考又被广大考生提上了日程&#xff0c;由于“先上岗&#xff0c;后考证”政策&#xff0c;小编预测下一年教师资格证考试的通过率肯定没有以前那么高了&#xff0c;不少人就想选择异地…

python3项目源代码下载_2019年最值得关注的34个Python开源项目——Let's go!

踏着人工智能、区块链的东风&#xff0c;近年来一路“横冲直撞”的 Python 在实现了从小众语言到主流的完美转身后&#xff0c;一头扎进了 2019&#xff0c;依旧没有透出丝毫停下来的架势&#xff0c;反倒有些越烧越热的味道。本文将为你介绍 2019 年最值得关注的 34 个 Python…

Unity 音频优化方案

参考资料&#xff1a; https://www.cnblogs.com/bearhb/p/11210136.html https://blog.csdn.net/chenfujun818/article/details/81710895 文件格式 mp3:失真小&#xff0c;适合音质要求高的文件&#xff0c;例如BGM wav:资源大&#xff0c;不推荐 ogg:压缩比高&#xff0c;适…

android home键后计时拉起app_使用React Native完成App软件

搭建开发环境安装react-native-cli&#xff1a;npm i -g react-native-cliAndroid SDK安装Android SDK并启动进行配置&#xff1a;配置环境变量export ANDROID_HOME~/Library/Android/sdk export PATH${PATH}:${ANDROID_HOME}/tools export PATH${PATH}:${ANDROID_HOME}/platfo…

Unity AssetBundle内存管理相关问题

AssetBundle机制相关资料收集 最近网友通过网站搜索Unity3D在手机及其他平台下占用内存太大. 这里写下关于Unity3D对于内存的管理与优化. Unity3D 里有两种动态加载机制&#xff1a;一个是Resources.Load&#xff0c;另外一个通过AssetBundle,其实两者区别不大。 Resources.L…

移动超级sim卡 无法下载卡_中国移动发布超级SIM卡:全变了

近日&#xff0c;中国移动正式公布了《中国移动超级SIM卡技术白皮书》&#xff0c;明确乐中国移动对于个人领域SIM卡的发展方向、架构设计、能力要求&#xff0c;旨在为行业规划设计SIM卡相关技术、产品和解决方案时提供参考和指引。据悉&#xff0c;中国移动的超级SIM卡增强了…

echart中拆线点的偏移_Qt中圆弧和扇形的绘制

在超声软件的开发中&#xff0c;超声成像模块需要绘制圆弧&#xff0c;例如绘制一个扇形的取样框&#xff0c;左右是一条直线&#xff0c;上下是一个圆弧&#xff0c;像这样。Qt中使用QPainter::drawArc绘制圆弧&#xff0c;使用QPainter::drawPie绘制扇形。圆弧和扇形的绘制接…

反向Z(Reversed-Z)的深度缓冲原理

参考文章&#xff1a;https://zhuanlan.zhihu.com/p/75517534 https://zjinc36.github.io/2020/03/10/2020-20200309-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E6%B5%AE%E7%82%B9%E6%95%B0%E4%B8%8E%E6%B5%AE%E7%82%B9%E6%95%B0%E7%9A%84%E7%B2%BE%E5%BA%A6%E9%97%AE%E9%A2%98/ …

output怎么用_性能领先,即训即用,快速部署,飞桨首次揭秘服务器端推理库

允中 发自 凹非寺量子位 编辑 | 公众号 QbitAI假如问在深度学习实践中&#xff0c;最难的部分是什么&#xff1f;猜测80%的开发者都会说&#xff1a;“当然是调参啊。”为什么难呢&#xff1f;因为调参就像厨师根据食材找到了料理配方&#xff0c;药剂师根据药材找到了药方&…

GPU架构杂乱备忘——IMR、TBR、TBDR

原文&#xff1a;https://juejin.cn/post/6844904132864655367 GPU架构杂乱备忘——IMR、TBR、TBDR 之前觉得涉及到gpu架构相关的问题只需要知道个大概就好&#xff0c;毕竟在图形api的层面上应该把硬件的细节给隐蔽掉&#xff0c;gpu的架构千千万万&#xff0c;每家厂商每个…

requests下载大文件_11种方法教你用Python高效下载资源!

在本教程中&#xff0c;你将学习如何使用不同的Python模块从web下载文件。此外&#xff0c;你将下载常规文件、web页面、Amazon S3和其他资源。最后&#xff0c;你将学习如何克服可能遇到的各种挑战&#xff0c;例如下载重定向的文件、下载大型文件、完成一个多线程下载以及其他…

android自定义push通知_20个海外Web和App推送通知服务工具

在App和网站中使用推送通知有不同的原因&#xff0c;并且在提高流量和与客户互动方面有很多好处。推送通知是一种交互式可点击消息&#xff0c;可将访问者直接引导至你的网站。它们可以帮助你以指数方式增加流量和参与率。因此&#xff0c;营销人员&#xff0c;广告商&#xff…

linux 删除文件_Linux删除文件夹命令有哪些

今天要和大家分享的Linux常用命令是Linux删除文件夹命令,Linux删除文件夹很简单,常用的命令有rmdir和rm,以下分别介绍一下,大家根据情况选择使用即可。 Linux删除文件夹命令有哪些 ①Linux删除文件夹命令:rmdir rmdir命令使用场景: 当有空目录要删除时,可使用rmdir指令。…

url上接收到 el表达式 不渲染_一文摸透从输入URL到页面渲染的过程

一文摸透从输入URL到页面渲染的过程从输入URL到页面渲染需要Chrome浏览器的多个进程配合&#xff0c;所以我们先来谈谈现阶段Chrome浏览器的多进程架构。一、Chrome架构目前Chrome采用的是多进程的架构模式&#xff0c;可分为主要的五类进程&#xff0c;分别是&#xff1a;浏览…

模拟弱网工具的使用

https://zhuanlan.zhihu.com/p/98185153 https://www.jianshu.com/p/5e35a3585df5 今年5G技术开始铺开并进入商用。随着5G的到来&#xff0c;不知道大家有没有和我一样的感受&#xff0c;希望是我心理作用吧&#xff0c;我发现作为一个4G用户&#xff0c;最近我的手机网速是不…

c语言计算a+aa+aaa_物业服务企业信用等级公布,42家获AAA级!你家小区物业怎么样?...

杭州住保房管 根据《浙江省物业服务企业信用信息管理办法》和《浙江省行业信用监管责任体系构建工作方案》&#xff0c;日前&#xff0c;省建设厅公布了 2020年度浙江省物业服务企业信用等级结果名单&#xff0c;杭州165家物业服务企业上榜&#xff0c;绿城物业服务集团有限公司…

python 可视化_python可视化基础

常用的python可视化工具包是matplotlib&#xff0c;seaborn是在matplotlib基础上做的进一步封装。入坑python可视化&#xff0c;对有些人来说如同望山跑死马&#xff0c;心气上早输了一节。其实学习一门新知识&#xff0c;首先要掌握的是这门知识的最少最核心知识&#xff0c;剩…

使用post访问不到接口_Postman工具使用说明

一、工具说明接口测试工具&#xff0c;支持post&#xff0c;get&#xff0c;请求的接口测试&#xff1b;支持参数中带token&#xff0c;带cookie等接口测试。印度阿三开发的产品&#xff0c;稳定性较好&#xff0c;强烈推荐&#xff0c;屡试很爽。适用&#xff1a;前后端分离的…

java正则表达式判断手机号_正则表达式学习之简单手机号和邮箱练习

正则表达式的组成规则在java中&#xff0c;正则表达式的编译是类java.util.regex.Pattern正则表达式的构造摘要1.字符x包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号的普通字符。比如之前的例子可以将[1-9][0-9]{4,12}改成1[0-9]{4,12}或者a[0-9]{4,12}此时就…