写在之前
在 Python 操作 MongoDB 数据库(上) 这篇文章中,我们学洗了 MongoDB 数据库的安装运行和使用,以及用 Python 连接 MongoDB。我们建立的 books 引用的是一个 MongoDB 的集合对象,既然是对象,那么就有一些方法供我们使用,今天我们就来学习一下。
编辑
>>> type(books)
<class 'pymongo.collection.Collection'>
>>> 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 修改器,它可以用来指定键值,如果键不存在则创建。关于更多的修改器,如下所示(截图来源于网上):
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。