热门标签 | 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 的交互模式下:

Python 操作 MongoDB 数据库

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

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

> use mydb
switched to db mydb
> db
mydb
>

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

> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB

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

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

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

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

> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
mydb    0.000GB

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

安装 pymongo

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

pip3 install pymongo

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

Installing collected packages: pymongo
Successfully installed pymongo-3.7.1

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

>>> import pymongo
>>> pymongo.version
'3.7.1'

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

Python 连接 MongoDB

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

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

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

>>> dir(pymongo)

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

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

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

>>> mdb = client.mydb

或者是:

>>> mdb = client['mydb']

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

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

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

>>> books = mdb["books"]

或者是:

>>> books = mdb.books

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

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

编辑

>>> type(books)

>>> dir(books)

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

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

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

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

1.增加

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

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

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

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

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

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

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

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

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

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

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

>>> n1 = {"title":"enter","name":"bash"}
>>> n2 = {"title":"code","name":"john"}
>>> n3 = {"title":"warner","name":"lisp"}
>>> n = [n1,n2,n3]
>>> n
[{'name': 'bash', 'title': 'enter'}, {'name': 'john', 'title': 'code'}, {'name':
'lisp', 'title': 'warner'}]


>>> books.insert(n)
[ObjectId('5badc702b2e7d42bccfb6b32'), ObjectId('5badc702b2e7d42bccfb6b33'), Obj
ectId('5badc702b2e7d42bccfb6b34')]

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

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

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

2.查询

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

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

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

>>> for i in books.find().sort("title",pymongo.ASCENDING):
...    print(i)
...
{u'_id': ObjectId('5badb9f1b2e7d42bccfb6b31'), u'name': u'qwer'}
{u'_id': ObjectId('5badc702b2e7d42bccfb6b33'), u'name': u'john', u'title': u'cod
e'}
{u'_id': ObjectId('5badc702b2e7d42bccfb6b32'), u'name': u'bash', u'title': u'ent
er'}
{u'title': u'physics', u'_id': ObjectId('5badb7c8b2e7d42bccfb6b30'), u'like': u'
English', u'author': u'leey'}
{u'_id': ObjectId('5badc702b2e7d42bccfb6b34'), u'name': u'lisp', u'title': u'war
ner'}
{u'like': u'python', u'_id': ObjectId('5bab28b6a1888724cb5ba515'), u'author': u'
rocky', u'title': u'zero study python'}

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

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

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

3.更新

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

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

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

Python 操作 MongoDB 数据库

4.删除

删除可以用 remove() 方法:

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

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

5.索引

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

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

写在之后

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

更多内容,欢迎关注公众号「Python空间」,期待和你的交流。
Python 操作 MongoDB 数据库


推荐阅读
author-avatar
张晓和46872
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有