本文整理自网络,侵删。
目录
- 前言
- 1. 准备工作
- 2. 连接MongoDB
- 3. 指定数据库
- 4. 指定集合
- 5. 插入数据
- 6. 查询
- 7. 计数
- 8. 排序
- 9. 偏移
- 10. 更新
- 11. 删除
- 12. 其他操作
前言
MongoDB是由C++语言编写的非关系型数据库,是一个基于分布式文件存储的开源数据库系统,其内容存储形式类似JSON对象,它的字段值可以包含其他文档、数组及文档数组,非常灵活。在这一节中,我们就来看看Python 3下MongoDB的存储操作。
1. 准备工作
在开始之前,请确保已经安装好了MongoDB并启动了其服务,并且安装好了Python的PyMongo库。
2. 连接MongoDB
连接MongoDB时,我们需要使用PyMongo库里面的MongoClient
。一般来说,传入MongoDB的IP及端口即可,其中第一个参数为地址host
,第二个参数为端口port
(如果不给它传递参数,默认是27017):
import pymongo client = pymongo.MongoClient(host='localhost', port=27017)
这样就可以创建MongoDB的连接对象了。
另外,MongoClient
的第一个参数host
还可以直接传入MongoDB的连接字符串,它以mongodb
开头,例如:
client = MongoClient('mongodb://localhost:27017/')
这也可以达到同样的连接效果。
3. 指定数据库
MongoDB中可以建立多个数据库,接下来我们需要指定操作哪个数据库。这里我们以test数据库为例来说明,下一步需要在程序中指定要使用的数据库:
db = client.test
这里调用client
的test
属性即可返回test数据库。当然,我们也可以这样指定:
db = client['test']
这两种方式是等价的。
4. 指定集合
MongoDB的每个数据库又包含许多集合(collection),它们类似于关系型数据库中的表。
下一步需要指定要操作的集合,这里指定一个集合名称为students。与指定数据库类似,指定集合也有两种方式:
collection = db.students
collection = db['students']
这样我们便声明了一个Collection
对象。
5. 插入数据
接下来,便可以插入数据了。对于students这个集合,新建一条学生数据,这条数据以字典形式表示:
student = { 'id': '20170101', 'name': 'Jordan', 'age': 20, 'gender': 'male' }
这里指定了学生的学号、姓名、年龄和性别。接下来,直接调用collection
的insert()
方法即可插入数据,代码如下:
result = collection.insert(student) print(result)
在MongoDB中,每条数据其实都有一个_id
属性来唯一标识。如果没有显式指明该属性,MongoDB会自动产生一个ObjectId
类型的_id
属性。insert()
方法会在执行后返回_id
值。
运行结果如下:
5932a68615c2606814c91f3d
当然,我们也可以同时插入多条数据,只需要以列表形式传递即可,示例如下:
student1 = { 'id': '20170101', 'name': 'Jordan', 'age': 20, 'gender': 'male' } student2 = { 'id': '20170202', 'name': 'Mike', 'age': 21, 'gender': 'male' } result = collection.insert([student1, student2]) print(result)
返回结果是对应的_id
的集合:
[ObjectId('5932a80115c2606a59e8a048'), ObjectId('5932a80115c2606a59e8a049')]
实际上,在PyMongo 3.x版本中,官方已经不推荐使用insert()
方法了。当然,继续使用也没有什么问题。官方推荐使用insert_one()
和insert_many()
方法来分别插入单条记录和多条记录,示例如下:
student = { 'id': '20170101', 'name': 'Jordan', 'age': 20, 'gender': 'male' } result = collection.insert_one(student) print(result) print(result.inserted_id)
运行结果如下:
<pymongo.results.InsertOneResult object at 0x10d68b558>
5932ab0f15c2606f0c1cf6c5
与insert()
方法不同,这次返回的是InsertOneResult
对象,我们可以调用其inserted_id
属性获取_id
。
对于insert_many()
方法,我们可以将数据以列表形式传递,示例如下:
student1 = { 'id': '20170101', 'name': 'Jordan', 'age': 20, 'gender': 'male' } student2 = { 'id': '20170202', 'name': 'Mike', 'age': 21, 'gender': 'male' } result = collection.insert_many([student1, student2]) print(result) print(result.inserted_ids)
运行结果如下:
<pymongo.results.InsertManyResult object at 0x101dea558>
[ObjectId('5932abf415c2607083d3b2ac'), ObjectId('5932abf415c2607083d3b2ad')]
该方法返回的类型是InsertManyResult
,调用inserted_ids
属性可以获取插入数据的_id
列表。
6. 查询
插入数据后,我们可以利用find_one()
或find()
方法进行查询,其中find_one()
查询得到的是单个结果,find()
则返回一个生成器对象。示例如下:
result = collection.find_one({'name': 'Mike'}) print(type(result)) print(result)
这里我们查询name
为Mike
的数据,它的返回结果是字典类型,运行结果如下:
<class 'dict'> {'_id': ObjectId('5932a80115c2606a59e8a049'), 'id': '20170202', 'name': 'Mike', 'age': 21, 'gender': 'male'}
可以发现,它多了_id
属性,这就是MongoDB在插入过程中自动添加的。
此外,我们也可以根据ObjectId
来查询,此时需要使用bson库里面的objectid
:
from bson.objectid import ObjectId result = collection.find_one({'_id': ObjectId('593278c115c2602667ec6bae')}) print(result)
其查询结果依然是字典类型,具体如下:
{'_id': ObjectId('593278c115c2602667ec6bae'), 'id': '20170101', 'name': 'Jordan', 'age': 20, 'gender': 'male'}
当然,如果查询结果不存在,则会返回None
。
对于多条数据的查询,我们可以使用find()
方法。例如,这里查找年龄为20的数据,示例如下:
results = collection.find({'age': 20}) print(results) for result in results: print(result)
运行结果如下:
<pymongo.cursor.Cursor object at 0x1032d5128> {'_id': ObjectId('593278c115c2602667ec6bae'), 'id': '20170101', 'name': 'Jordan', 'age': 20, 'gender': 'male'} {'_id': ObjectId('593278c815c2602678bb2b8d'), 'id': '20170102', 'name': 'Kevin', 'age': 20, 'gender': 'male'} {'_id': ObjectId('593278d815c260269d7645a8'), 'id': '20170103', 'name': 'Harden', 'age': 20, 'gender': 'male'}
返回结果是Cursor
类型,它相当于一个生成器,我们需要遍历取到所有的结果,其中每个结果都是字典类型。
如果要查询年龄大于20的数据,则写法如下:
results = collection.find({'age': {'$gt': 20}})
这里查询的条件键值已经不是单纯的数字了,而是一个字典,其键名为比较符号$gt
,意思是大于,键值为20。
这里将比较符号归纳为下表。
符号 | 含义 | 示例 |
---|---|---|
$lt | 小于 | {'age': {'$lt': 20}} |
$gt | 大于 | {'age': {'$gt': 20}} |
$lte | 小于等于 | {'age': {'$lte': 20}} |
$gte | 大于等于 | {'age': {'$gte': 20}} |
$ne | 不等于 | {'age': {'$ne': 20}} |
$in | 在范围内 | {'age': {'$in': [20, 23]}} |
$nin | 不在范围内 | {'age': {'$nin': [20, 23]}} |
另外,还可以进行正则匹配查询。例如,查询名字以M开头的学生数据,示例如下:
results = collection.find({'name': {'$regex': '^M.*'}})
这里使用$regex
来指定正则匹配,^M.*
代表以M开头的正则表达式。
相关阅读 >>
php中mongodb数据库的连接、添加、修改、查询、删除等操作实例
更多相关阅读请进入《mongodb》频道 >>
数据库系统概念 第6版
机械工业出版社
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。
转载请注明出处:木庄网络博客 » 深入了解Python如何操作MongoDB
相关推荐
评论
管理员已关闭评论功能...