千家信息网

python操作MongoDB的方法是什么

发表于:2024-09-22 作者:千家信息网编辑
千家信息网最后更新 2024年09月22日,这篇文章主要介绍"python操作MongoDB的方法是什么"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"python操作MongoDB的方法是什么"文章能帮
千家信息网最后更新 2024年09月22日python操作MongoDB的方法是什么

这篇文章主要介绍"python操作MongoDB的方法是什么"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"python操作MongoDB的方法是什么"文章能帮助大家解决问题。

MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写,旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。


1. 准备工作

在开始之前,请确保已经安装好了MongoDB并启动了其服务,并且安装好了Python的PyMongo库。

2. 连接MongoDB

连接MongoDB时,我们需要使用PyMongo库里面的MongoClient。一般来说,传入MongoDB的IP及端口即可,其中第一个参数为地址host,第二个参数为端口port(如果不给它传递参数,默认是27017):

import pymongoclient = 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.studentscollection = 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)

运行结果如下:

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)

运行结果如下:

[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的数据,它的返回结果是字典类型,运行结果如下:

'dict'>{'_id': ObjectId('5932a80115c2606a59e8a049'), 'id': '20170202', 'name': 'Mike', 'age': 21, 'gender': 'male'}

可以发现,它多了_id属性,这就是MongoDB在插入过程中自动添加的。

此外,我们也可以根据ObjectId来查询,此时需要使用bson库里面的objectid:

from bson.objectid import ObjectIdresult = 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)

运行结果如下:

{'_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。

另外,还可以进行正则匹配查询。例如,查询名字以M开头的学生数据,示例如下:

results = collection.find({'name': {'$regex': '^M.*'}})

这里使用$regex来指定正则匹配,^M.*代表以M开头的正则表达式。

7. 计数

要统计查询结果有多少条数据,可以调用count()方法。比如,统计所有数据条数:

count = collection.find().count()print(count)

或者统计符合某个条件的数据:

count = collection.find({'age': 20}).count()print(count)

运行结果是一个数值,即符合条件的数据条数。

8. 排序

排序时,直接调用sort()方法,并在其中传入排序的字段及升降序标志即可。示例如下:

results = collection.find().sort('name', pymongo.ASCENDING)print([result['name'] for result in results])

运行结果如下:

['Harden', 'Jordan', 'Kevin', 'Mark', 'Mike']

这里我们调用pymongo.ASCENDING指定升序。如果要降序排列,可以传入pymongo.DESCENDING。

9. 偏移

在某些情况下,我们可能想只取某几个元素,这时可以利用skip()方法偏移几个位置,比如偏移2,就忽略前两个元素,得到第三个及以后的元素:

results = collection.find().sort('name', pymongo.ASCENDING).skip(2)print([result['name'] for result in results])

运行结果如下:

['Kevin', 'Mark', 'Mike']

另外,还可以用limit()方法指定要取的结果个数,示例如下:

results = collection.find().sort('name', pymongo.ASCENDING).skip(2).limit(2)print([result['name'] for result in results])

运行结果如下:

['Kevin', 'Mark']

如果不使用limit()方法,原本会返回三个结果,加了限制后,会截取两个结果返回。

值得注意的是,在数据库数量非常庞大的时候,如千万、亿级别,最好不要使用大的偏移量来查询数据,因为这样很可能导致内存溢出。此时可以使用类似如下操作来查询:

from bson.objectid import ObjectIdcollection.find({'_id': {'$gt': ObjectId('593278c815c2602678bb2b8d')}})

这时需要记录好上次查询的_id。

10. 更新

对于数据更新,我们可以使用update()方法,指定更新的条件和更新后的数据即可。例如:

condition = {'name': 'Kevin'}student = collection.find_one(condition)student['age'] = 25result = collection.update(condition, student)print(result)

这里我们要更新name为Kevin的数据的年龄:首先指定查询条件,然后将数据查询出来,修改年龄后调用update()方法将原条件和修改后的数据传入。

运行结果如下:

{'ok': 1, 'nModified': 1, 'n': 1, 'updatedExisting': True}

返回结果是字典形式,ok代表执行成功,nModified代表影响的数据条数。

另外,我们也可以使用$set操作符对数据进行更新,代码如下:

result = collection.update(condition, {'$set': student})

这样可以只更新student字典内存在的字段。如果原先还有其他字段,则不会更新,也不会删除。而如果不用$set的话,则会把之前的数据全部用student字典替换;如果原本存在其他字段,则会被删除。

另外,update()方法其实也是官方不推荐使用的方法。这里也分为update_one()方法和update_many()方法,用法更加严格,它们的第二个参数需要使用$类型操作符作为字典的键名,示例如下:

condition = {'name': 'Kevin'}student = collection.find_one(condition)student['age'] = 26result = collection.update_one(condition, {'$set': student})print(result)print(result.matched_count, result.modified_count)

这里调用了update_one()方法,第二个参数不能再直接传入修改后的字典,而是需要使用{‘$set’: student}这样的形式,其返回结果是UpdateResult类型。然后分别调用matched_count和modified_count属性,可以获得匹配的数据条数和影响的数据条数。

运行结果如下:

1 0

我们再看一个例子:

condition = {'age': {'$gt': 20}}result = collection.update_one(condition, {'$inc': {'age': 1}})print(result)print(result.matched_count, result.modified_count)

这里指定查询条件为年龄大于20,然后更新条件为{‘$inc’: {‘age’: 1}},也就是年龄加1,执行之后会将第一条符合条件的数据年龄加1。

运行结果如下:

1 1

可以看到匹配条数为1条,影响条数也为1条。

如果调用update_many()方法,则会将所有符合条件的数据都更新,示例如下:

condition = {'age': {'$gt': 20}}result = collection.update_many(condition, {'$inc': {'age': 1}})print(result)print(result.matched_count, result.modified_count)

这时匹配条数就不再为1条了,运行结果如下:

3 3

可以看到,这时所有匹配到的数据都会被更新。

11. 删除

删除操作比较简单,直接调用remove()方法指定删除的条件即可,此时符合条件的所有数据均会被删除。示例如下:

result = collection.remove({'name': 'Kevin'})print(result)

运行结果如下:

{'ok': 1, 'n': 1}

另外,这里依然存在两个新的推荐方法——delete_one()和delete_many()。示例如下:

result = collection.delete_one({'name': 'Kevin'})print(result)print(result.deleted_count)result = collection.delete_many({'age': {'$lt': 25}})print(result.deleted_count)

运行结果如下:

14

delete_one()即删除第一条符合条件的数据,delete_many()即删除所有符合条件的数据。它们的返回结果都是DeleteResult类型,可以调用deleted_count属性获取删除的数据条数。

12. 其他操作

另外,PyMongo还提供了一些组合方法,如find_one_and_delete()、find_one_and_replace()和find_one_and_update(),它们是查找后删除、替换和更新操作,其用法与上述方法基本一致。

另外,还可以对索引进行操作,相关方法有create_index()、create_indexes()和drop_index()等。

关于"python操作MongoDB的方法是什么"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。

数据 方法 结果 查询 运行 条件 更新 示例 数据库 字典 属性 类型 年龄 参数 形式 字段 对象 偏移 推荐 接下来 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 华为服务器收入排行榜 excel 取前7位数据库 石家庄市软件开发培训学校 天津网络技术基础 高级数据库测试方法 平果手机显示没有服务器怎么办 手机浏览器数据库错误如何处理 游戏服务器开发面试题 小米集团软件开发试卷 网络安全与信息化杂志 青少年网络安全知识课件 软件开发专业有哪些学校 江苏互联网智能科技产品是什么 数据库河北工业大学图书馆 蚌埠租房网络安全 奇谦网络技术有限 跨数据库视图 怎么考上武汉网络安全大学 数据库表操作题视频教程 湛江专业软件开发市价 衡阳网络安全培训机构学历要求低 战地5如何加入别人的私人服务器 腾讯用的网络安全是哪家公司 2008数据库安装没设密码 数据库自动化系统的基本原理 网络安全与信息化杂志 以政治必修一谈网络安全 无网络安全执法 上海梵网络技术有限公司 中兴服务器管理ip
0