热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python操作MongoDB数据库

写在之前MongoDB也是当下比较火的数据库之一,因为时代的发展需要NoSQL,还是老办法,在本篇文章中呢,我先来介绍一下MongoDB数据库的安装运行和使用,以及用Python连


写在之前

MongoDB 也是当下比较火的数据库之一,因为时代的发展需要 NoSQL,还是老办法,在本篇文章中呢,我先来介绍一下 MongoDB 数据库的安装运行和使用,以及用 Python 连接 MongoDB,下面就开始今天的学习。

MongoDB 简介

在这之前,我们先来了解一下什么是 NoSQL:

NoSQL 也就是 Not only SQL,指的是非关系型数据库,它是为了大规模 Web

应用而生的,它的特征诸如模式自由、支持简易复制、简单的 API、大容量数据等。

MongoDB 是 NoSQL 中的一种,选择它的原因是它具有如下特点:

面向文档存储。

对任何对象可索引。

复制和高可用性。

自动分片。

丰富的查询。

快速就地更新。

基于 MongoDB 的特点,它擅长的领域如下:

大数据。

内容管理和交付。

移动和社交基础设施。

数据平台。

如果大家感兴趣的话,也可以去学习其它的 NoSQL 数据库。

安装 MongoDB

这个和 MySQL 一样,你要使用它,首先就要安装。因为篇幅有限且每个人的操作系统都不一样,具体怎么安装,我不在这赘述,网上的教程很多,随便 Google 一下就是一大堆。

启动 MongoDB

安装完毕后就可以启动数据库。我在这里建立一个简单的库,并且捎带说明 MongoDB 的基本要点,目的在于为后面用 Python 来操作它做铺垫。在这我以 windows 为例,首先进入到 MongoDB 的交互模式下:

上图我截取了一部分,在 windows 的 cmd 中,进入到你安装 MongoDB 的目录下的 bin 文件夹中,运行 mongo.exe 进入到 MongoDB 交互模式。进入之后有点类似 MySQL 的状态。

在 MongoDB 中,有一个全局变量 db,使用哪个数据库,哪个数据库就会作为对象被赋值给这个全局变量 db。如果这个数据库不存在,就会被新建。

1 > use mydb
2 switched to db mydb
3 > db
4 mydb
5 >

除非是向这个数据库中增加实质性的内容,否则它是看不到的。

1 > show dbs
2 admin 0.000GB
3 config 0.000GB
4 local 0.000GB

向这个数据库中增加一些东西,MongoDB 的基本单元是「文档」。所谓的「文档」就是类似于 Python 中的字典,以「键/值对」的方式保存数据。

1 > book = {"title":"zero study python","author":"rocky","like":"python"}
2 { "title" : "zero study python", "author" : "rocky", "like" : "python" }
3 > db.books.insert(book)
4 WriteResult({ "nInserted" : 1 })
5 > db.books.find()
6 { "_id" : ObjectId("5bab28b6a1888724cb5ba515"), "title" : "zero study python", "
7 author" : "rocky", "like" : "python" }

db 指向了数据库 mydb,books 是这个数据库里面的一个集合(类似于 MySQL 中的表),向集合 books 里面插入了一个文档(文档对应 MySQL 里面的记录)。「数据库」、「集合」、「文档」构成了 MongoDB 数据库。

上面的操作有一个比较有意思的地方,并没有 create 之类的命令,用到数据库,就通过 use ,如果不存在就建立;用到集合,就通过 db. 来使用,如果没有就建立。可以总结为“随用,随取,随建立”,简单的一批。

1> show dbs
2 admin 0.000GB
3 config 0.000GB
4 local 0.000GB
5 mydb 0.000GB

当有了内容以后,就可以看到刚才用到的数据库 mydb 了。简单的使用就是这些,下面就来重头戏啦,毕竟我们是主学 Python 的啊。

安装 pymongo

要用 Python 来驱动 MongoDB,必须要安装驱动模块,即 pymongo,这个跟操作 MySQL 是类似的。安装方法推荐如下(windows 下):

1 pip3 install pymongo

如果顺利就会看到最后的提示:

1 Installing collected packages: pymongo
2 Successfully installed pymongo-3.7.1

然后我们来看一下安装的版本号:

1 >>> import pymongo
2 >>> pymongo.version
3 '3.7.1'

上面 import pymongo 没有问题,证明一切都可以了。

Python 连接 MongoDB

既然 Python 驱动 MongoDB 的模块 pymongo 已安装完毕,那么接下来就是连接,即「建立连接对象」。

1 >>> import pymongo
2 >>> pymongo.Connection('localhost',27017)
3 Traceback (most recent call last):
4 File "", line 1, in
5 AttributeError: 'module' object has no attribute 'Connection'

竟然报错??怎么回事??明明很多书上都是这么写的,为啥会报错呢?一定要注意这里的坑!这个很版本有关系,我刚学的时候这里直接把我坑傻了。如何你用的是旧版本的 pymongo,比如 2.8 的,你仍然可以用上面的方法,但是你如果用的是新版本的,就得注意一下了,有时候不能盲目的相信书上的东西,因为会有些东西是会变的!

1 >>> dir(pymongo)

是时候请出我们的 dir 来了,看看哪些方法可用,因为结果太多我就不贴上来了,你可以自行在交互模式运行,运行的结果你会发现里面没有 Connection() 这个方法,但是发现有一个 MongoClient(),这是柳暗花明又一村。

1 >>> client = pymongo.MongoClient('localhost',27017)

随着上面这行代码的运行,Python 已经和 MongoDB 建立了连接。刚才我们已经建立了一个数据库 mydb,并且在这个库里面有一个集合 books,于是:

1 >>> mdb = client.mydb

或者是:

1 >>> mdb = client['mydb']

上面的代码获得了数据库 mydb,并赋值给变量 mdb。

1 >>> mdb.collection_names()
2 [u'books']

查看集合,发现了我们已经建立好的那个 books,于是再获取这个集合,并赋值给一个变量 books:

1 >>> books = mdb["books"]

或者是:

1 >>> books = mdb.books

接下来,我们就可以操作这个集合中的具体内容啦。

上面的 books 所引用的是一个 MongoDB 的集合对象,它跟前面学习过的其它对象一样,也有一些方法供我们使用。

编辑

1 >>> type(books)
2
3 >>> dir(books)

还是用我们的老朋友 dir() ,你在自己的交互模式下运行的结果会发现有很多的方法,这么多方法在这里我不会一一介绍,只是按照「增删改查」的常用功能介绍几种,大家可以用 help() 去查看每一种方法的使用说明。

1 >>> books.find_one()
2 {u'like': u'python', u'_id': ObjectId('5bab28b6a1888724cb5ba515'), u'author': u'
3 rocky', u'title': u'zero study python'}

这里提醒大家注意的是,MongoDB 的 shell 中的命令与 pymongo 中的方法有时候会稍有差别,这个务必小心。

目前在集合 books 中只有一个文档,如果还想再增加,就需要进行「增删改查」的常规操作。

1.增加

1 >>> b2 = {"title":"physics","author":"leey","like":"English"}
2 >>> books.insert(b2)
3 ObjectId('5badb7c8b2e7d42bccfb6b30')

上面成功的向集合中增加一个文档。

1 >>> books.find().count()

这是查看当前集合有多少个文档的方式,返回值为 2,则说明集合中有两个文档,但还是要看看内容的:

1 >>> books.find_one()
2 {u'like': u'python', u'_id': ObjectId('5bab28b6a1888724cb5ba515'), u'author': u'
3 rocky', u'title': u'zero study python'}

这个命令就不行,因为它只返回第一条,必须要:

1 >>> for i in books.find():
2 ... print(i)
3 ...
4 {u'like': u'python', u'_id': ObjectId('5bab28b6a1888724cb5ba515'), u'author': u'
5 rocky', u'title': u'zero study python'}
6 {u'title': u'physics', u'_id': ObjectId('5badb7c8b2e7d42bccfb6b30'), u'like': u'
7 English', u'author': u'leey'}

在 books 引用的印象中有 find() 方法,它返回的是一个可迭代对象,包含着集合中所有的文档。

由于文档是「键/值对」,不一定每一个文档的结构都要一样。比如可以在集合中插入像下面这样的文档:

1 >>> books.insert({"name":"qwer"})
2 ObjectId('5badb9f1b2e7d42bccfb6b31')
3 >>> for i in books.find():
4 ... print(i)
5 ...
6 {u'like': u'python', u'_id': ObjectId('5bab28b6a1888724cb5ba515'), u'author': u'
7 rocky', u'title': u'zero study python'}
8 {u'title': u'physics', u'_id': ObjectId('5badb7c8b2e7d42bccfb6b30'), u'like': u'
9 English', u'author': u'leey'}
10 {u'_id': ObjectId('5badb9f1b2e7d42bccfb6b31'), u'name': u'qwer'}

如果有多个文档,想同时插入到集合中,可以像下面这样做:

1 >>> n1 = {"title":"enter","name":"bash"}
2 >>> n2 = {"title":"code","name":"john"}
3 >>> n3 = {"title":"warner","name":"lisp"}
4 >>> n = [n1,n2,n3]
5 >>> n
6 [{'name': 'bash', 'title': 'enter'}, {'name': 'john', 'title': 'code'}, {'name':
7 'lisp', 'title': 'warner'}]
8
9
10 >>> books.insert(n)
11 [ObjectId('5badc702b2e7d42bccfb6b32'), ObjectId('5badc702b2e7d42bccfb6b33'), Obj
12 ectId('5badc702b2e7d42bccfb6b34')]

这样就完成了所谓的批量插入,查看一下文档个数:

1 >>> books.find().count()
2 6

这里需要提醒一下的是,批量插入的文档大小是有限制的,具体是多少没有碰到过,一般情况下或许达不到上限,如果遇到极端情况,那么就要多多注意啦。

2.查询

如果要查询的话,除了通过循环以外,能不能按照某个条件查询呢?比如查找 name = bash 的文档:

1 >>> books.find_one({"name":"bash"})
2 {u'_id': ObjectId('5badc702b2e7d42bccfb6b32'), u'name': u'bash', u'title': u'ent
3 er'}

对于查询结果,还可以进行排序:

1 >>> for i in books.find().sort("title",pymongo.ASCENDING):
2 ... print(i)
3 ...
4 {u'_id': ObjectId('5badb9f1b2e7d42bccfb6b31'), u'name': u'qwer'}
5 {u'_id': ObjectId('5badc702b2e7d42bccfb6b33'), u'name': u'john', u'title': u'cod
6 e'}
7 {u'_id': ObjectId('5badc702b2e7d42bccfb6b32'), u'name': u'bash', u'title': u'ent
8 er'}
9 {u'title': u'physics', u'_id': ObjectId('5badb7c8b2e7d42bccfb6b30'), u'like': u'
10 English', u'author': u'leey'}
11 {u'_id': ObjectId('5badc702b2e7d42bccfb6b34'), u'name': u'lisp', u'title': u'war
12 ner'}
13 {u'like': u'python', u'_id': ObjectId('5bab28b6a1888724cb5ba515'), u'author': u'
14 rocky', u'title': u'zero study python'}

这里按照 title 的升序排列的,注意 sort() 的第二个参数,意思是升序排列,如果按照降序的话,就需要将参数修改为 pymongo.DESCEDING。

如果你看到这里,请务必注意 MongoDB 中的每个文档,本质上都是 键/值 对的类字典结构,这种结构一经 Python 读出来,就可以用字典中的各种方法来操作。

你是否还能记起我们之前讲过的 Json,这个也是类字典格式。但是用 Python 从 MongoDB 中读到的类字典数据,却无法直接用 json.dumps() 方法操作。

3.更新

对于已有的数据库来说,更新数据是常用的操作。比如更新 name 为 lisp 的文档:

1 >>> books.update({"name":"lisp"},{"$set":{"title":"new physics","author":"lisp"}
2 })
3 {'updatedExisting': True, u'nModified': 1, u'ok': 1.0, u'n': 1}

在更新的时候,用了一个 $set 修改器,它可以用来指定键值,如果键不存在则创建。关于更多的修改器,如下所示(截图来源于网上):

4.删除

删除可以用 remove() 方法:

1 >>> books.remove({"name":"bash"})
2 {u'ok': 1.0, u'n': 1}
3 >>> books.find_one({"name":"bash"})
4 >>>

这个是将整个文档全部删除。当然了,也可以根据 MongoDB 的语法规则写个条件,按照条件删除。

5.索引

索引的目的是为了让查询的速度更快,但是在实际应用中,是否建立索引要视情况而定,因为建立索引是有代价的。

1 >>> books.create_index([("title",pymongo.DESCENDING),])
2 u'title_-1'

写在之后

Python 操作 MongoDB 数据库的这篇文章仅仅是对 pymongo 模块做了一个非常简单的介绍,在实际的使用过程中,上面的知识其实是很有限的,所以还是需要大家根据具体应用场景再结合 MongoDB 的相关知识去尝试新的语句。



推荐阅读
  • 本文详细介绍了使用响应文件在静默模式下安装和配置Oracle 11g的方法。硬件要求包括:内存至少1GB,具体可通过命令`grep -i memtotal /proc/meminfo`进行检查。此外,还提供了详细的步骤和注意事项,确保安装过程顺利进行。 ... [详细]
  • 在生产环境中进行高效部署与优化 ... [详细]
  • 在Python 2.7环境中使用PyCharm进行Cvxopt的安装及线性规划问题求解。具体步骤包括:通过PyCharm的文件菜单进入项目设置,选择解释器选项,点击右侧的“+”按钮,在可用包列表中搜索并安装Cvxopt。安装完成后,可以通过导入Cvxopt库并调用其函数来解决线性规划问题,提高模型的准确性和效率。 ... [详细]
  • 在 Go 开发环境中,通过使用 iTerm 和 Oh My Zsh,可以显著提升终端操作的效率和体验。Oh My Zsh 是一个强大的 Zsh 配置管理框架,提供了丰富的插件支持,如代码高亮、自动补全和多种编程语言支持,同时还拥有众多美观的主题,使终端界面更加个性化和高效。Zsh 作为一种高度可定制的 shell,不仅适用于交互式应用,还可用作脚本解释器,集成了 bash、ksh 和 tcsh 等其他 shell 的诸多优点,并具备独特的功能特性。 ... [详细]
  • 您的环境缺少SentencePiece库,导致XLNetTokenizer无法正常运行 ... [详细]
  • 在Linux系统中将Python更新至3.7版本的方法如下:首先,从Python官方网站下载Python 3.7的安装包,例如使用 `wget` 命令下载 `Python-3.7.3.tgz`。其他版本的下载链接也可从Python官网获取。接下来,解压下载的文件并进入解压后的目录,运行配置脚本和编译命令以完成安装。确保在安装过程中添加Python 3.7到系统的环境变量中,以便全局使用。此外,建议检查当前系统的Python版本,以避免冲突。 ... [详细]
  • 如何在Linux系统中部署TensorFlow的详细指南
    本文详细介绍了在Linux系统中部署TensorFlow的过程。作者基于北京大学曹建教授的MOOC课程进行学习,但由于课程内容较旧,环境配置方面遇到了不少挑战。经过多次尝试,最终成功解决了这些问题,并总结了一套详细的安装指南,帮助初学者快速上手TensorFlow。 ... [详细]
  • 一、需求:        将MongoDB表中的数据按照时间戳增量抽取到Mysql表中。二、实现方式:   1.kettle    2.pytho ... [详细]
  • voc生成xml 代码
    目录 lxmlwindows安装 读取示例 可视化 生成示例 上面是代码,下面有调用示例 api调用代码,其实只有几行:这个生成代码也很简 ... [详细]
  • Python 数据分析领域不仅拥有高质量的开发环境,还提供了众多功能强大的第三方库。本文将介绍六个关键步骤,帮助读者掌握 Python 数据分析的核心技能,并深入探讨六款虽不广为人知但却极具潜力的数据处理库,如 Pandas 的替代品和新兴的可视化工具,助力数据科学家和分析师提升工作效率。 ... [详细]
  • 在Windows命令行中,通过Conda工具可以高效地管理和操作虚拟环境。具体步骤包括:1. 列出现有虚拟环境:`conda env list`;2. 创建新虚拟环境:`conda create --name 环境名`;3. 删除虚拟环境:`conda env remove --name 环境名`。这些命令不仅简化了环境管理流程,还提高了开发效率。此外,Conda还支持环境文件导出和导入,方便在不同机器间迁移配置。 ... [详细]
  • Python正则表达式详解:掌握数量词用法轻松上手
    Python正则表达式详解:掌握数量词用法轻松上手 ... [详细]
  • 在第七天的深度学习课程中,我们将重点探讨DGL框架的高级应用,特别是在官方文档指导下进行数据集的下载与预处理。通过详细的步骤说明和实用技巧,帮助读者高效地构建和优化图神经网络的数据管道。此外,我们还将介绍如何利用DGL提供的模块化工具,实现数据的快速加载和预处理,以提升模型训练的效率和准确性。 ... [详细]
  • MySQL日志分析在应急响应中的应用与优化策略
    在应急响应中,MySQL日志分析对于检测和应对数据库攻击具有重要意义。常见的攻击手段包括弱口令、SQL注入、权限提升和备份数据窃取。通过对MySQL日志的深入分析,不仅可以及时发现潜在的攻击行为,还能详细还原攻击过程并追踪攻击源头。此外,优化日志记录和分析策略,能够提高安全响应效率,增强系统的整体安全性。 ... [详细]
  • 运用Isotonic回归算法解决鸢尾花数据集中的回归挑战
    本文探讨了利用Isotonic回归算法解决鸢尾花数据集中的回归问题。首先介绍了Isotonic回归的基本原理及其在保持单调性方面的优势,并通过具体示例说明其应用方法。随后详细描述了鸢尾花数据集的特征和获取途径,最后展示了如何将Isotonic回归应用于该数据集,以实现更准确的预测结果。 ... [详细]
author-avatar
爵士KI
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有