Python 操作 MongoDB 数据库(下)

本文字数:3781 字
阅读本文大概需要:10 分钟
写在之前
在 python 操作 mongodb 数据库(上) 这篇文章中,我们学洗了 mongodb 数据库的安装运行和使用,以及用 python 连接 mongodb。我们建立的 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'), objectid('5badc702b2e7d42bccfb6b34')]
这样就完成了所谓的批量插入,查看一下文档个数:
>>>books.find().count()6
这里需要提醒一下的是,批量插入的文档大小是有限制的,具体是多少没有碰到过,一般情况下或许达不到上限,如果遇到极端情况,那么就要多多注意啦。
2.查询
如果要查询的话,除了通过循环以外,能不能按照某个条件查询呢?比如查找 name = bash 的文档:
>>> books.find_one({name:bash}){u'_id': objectid('5badc702b2e7d42bccfb6b32'), u'name': u'bash', u'title': u'enter'}
对于查询结果,还可以进行排序:
>>> 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'code'}{u'_id': objectid('5badc702b2e7d42bccfb6b32'), u'name': u'bash', u'title': u'enter'}{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'warner'}{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 修改器,它可以用来指定键值,如果键不存在则创建。关于更多的修改器,如下所示(截图来源于网上):
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 的相关知识去尝试新的语句。
如果你觉得本篇文章对你有帮助的话,欢迎点赞、转发、关注支持一下。
the end。