经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MongoDB » 查看文章
Python?操作?MongoDB数据库的方法(非?ODM)
来源:jb51  时间:2023/3/20 8:39:26  对本文有异议

一、连接器的安装和配置

pymongo: MongoDB 官方提供的 Python 工具包。官方文档: https://pymongo.readthedocs.io/en/stable/ pip安装,命令如下:

  1. pip install pymongo

管理 MongoDB 的主要步骤如下:

  • 连接到 MongoDB 数据库系统
  • 管理 MongoDB 数据库
  • 管理 MongoDB 中的集合
  • 管理 MongoDB 中的文档

第一步,连接 MongoDB:

  1. # 方式一: 使用默认的配置
  2. client = MongoClient()
  3. # 方式二: 指定主机地址和端口号
  4. client = MongoClient('localhost', 27017)
  5. # 方式三: 使用URI连接参数
  6. client = MongoClient('mongodb://localhost:27017/')

第二步,管理数据库:

  1. #通过MongoClient对象来管理多个数据库获取数据库(逻辑库)对象
  2. db = client.DATABASE_NAME
  3. db = client["DATABASE_NAME"]
  4. db = client.get_database(name=None, *args)
  5. # 查看所有的数据库(逻辑库)
  6. client.list_databases()
  7. # 删除数据库(逻辑库)
  8. client.drop_database(name_or_database, *args)

第三步,管理集合

  1. # 通过数据库对象db来管理集合
  2. # 获取集合对象
  3. db = client.DATABASE_NAME
  4. db.COLLECTION_NAME
  5. client.DATABASE_NAME.COLLECTION_NAME
  6. db.get_collection(name, *args)
  7. # 查看当前数据库下的集合列表
  8. db.list_collection_names()
  9. # 删除集合
  10. db.drop_collection(name_or_collection, *args)

基础操作示例:

  1. # -*- coding: utf-8 -*-
  2. # @Time : 2023-03-17 1:47
  3. # @Author : AmoXiang
  4. # @File : 1.数据库连接.py
  5. # @Software: PyCharm
  6. # @Blog : https://blog.csdn.net/xw1680
  7.  
  8. from pymongo import MongoClient
  9.  
  10. # 使用默认配置连接到数据库
  11. # client = MongoClient()
  12. # print(client)
  13. # client.close()
  14. # 指定主机地址和端口号连接到数据库
  15. # client = MongoClient('localhost', 27017)
  16. # 使用URI连接参数连接到数据库
  17. client = MongoClient('mongodb://localhost:27017/')
  18. print(client)
  19. # client.close()
  20. #
  21. # # 访问数据库
  22. # db = client.test
  23. # db = client["test"]
  24. # print(db)
  25. # db = client.get_database('test')
  26. # client.close()
  27. # print(db)
  28. #
  29. # 查看有哪些数据库
  30. db_list = client.list_databases()
  31. # # db_list = client.list_database_names()
  32. for item in db_list:
  33. print(item)
  34. #
  35. # 查看数据库下有哪些集合
  36. db_test = client["test"]
  37. for item in db_test.list_collection_names():
  38. print(item)
  39. #
  40. # # 集合对象操作
  41. # data = db_test.students.find_one()
  42. # data = client.test.students.find_one()
  43. data = client.test.get_collection('students').find_one()
  44. print(data)
  45.  

二、新增文档

说明:pymongo 在插入数据时可以将 python 的对象转换成 BSON

insert_one():插入一个文档

  1. # 调用方法
  2. result = db.COLLECTION_NAME.insert_one(doc)
  3. # 返回插入的文档ID
  4. result.inserted _id

insert_many():批量新增文档。调用方法:

  1. doc_list = [doc1,doc2]
  2. result = db.COLLECTION_NAME.insert_many(doc_list)

示例:

三、查询文档

pymongo 可以将查询的结果转换成 python 中的对象

常用方法:

  1. find_one(): 按条件查询一个文档
  2. find(): 按条件查询多个文档
  3. count_documents(): 统计满足条件的文档总数
  4. aggregate(): 聚合统计
  5. .sort(): 排序
  6. .skip().limit(): 分页

示例代码:

  1. # -*- coding: utf-8 -*-
  2. # @Time : 2023-03-18 15:03
  3. # @Author : AmoXiang
  4. # @File : 5.查询文档.py
  5. # @Software: PyCharm
  6. # @Blog : https://blog.csdn.net/xw1680
  7.  
  8. from bson.objectid import ObjectId
  9. from pymongo import MongoClient, ASCENDING, DESCENDING
  10.  
  11.  
  12. class LearnMongoDBSearch(object):
  13. """ MongoDB查询练习 """
  14.  
  15. def __init__(self):
  16. self.client = MongoClient()
  17.  
  18. def search_one(self):
  19. """ 查询一个文档 """
  20. temp_obj = self.client.test.newdb.find_one()
  21. print(temp_obj)
  22. print('喜欢分数:', temp_obj['likes'])
  23. # print('注册时间:', temp_obj['reg_date'].date())
  24. print('姓名:', temp_obj['uname'])
  25.  
  26. def search_user_by_pk(self, pk):
  27. obj_id = ObjectId(pk)
  28. # user_obj = self.client.test.newdb.find_one({'_id': obj_id})
  29. # 面向对象的方法,有代码提示
  30. db = self.client.get_database('test')
  31. users = db.get_collection('newdb')
  32. user_obj = users.find_one({'_id': obj_id})
  33. print(user_obj)
  34.  
  35. def search_many(self):
  36. """ 查询多个文档 """
  37. db = self.client.get_database('test')
  38. students = db.get_collection('students')
  39. # stu_list = students.find()
  40. # for item in stu_list:
  41. # print(item)
  42.  
  43. # 查询年龄大于12岁的学生
  44. stu_list = students.find({'age': {'$gt': 12}}, {'stu_name': 1, 'class_name': 1, 'age': 1})
  45. for item in stu_list:
  46. # 注意: mongo中存储的整数转换成了浮点数
  47. print(item)
  48.  
  49. def paginate(self, page=1, page_size=10):
  50. """
  51. 分页处理
  52. :param page: 当前的页
  53. :param page_size: 每一页数据大小
  54. :return:
  55. """
  56. db = self.client.get_database('test')
  57. students = db.get_collection('students')
  58. offset = (page - 1) * page_size
  59. stu_list = students.find().skip(offset).limit(page_size)
  60. return stu_list
  61.  
  62. def sort_data(self):
  63. """ 排序 """
  64. db = self.client.get_database('test')
  65. grades = db.get_collection('grades')
  66. # // 将学生的语文成绩从高到低排序
  67. # db.grades.find({"grade.course_name": "语文"}).sort({"grade.score": -1});
  68. #
  69. # //将学生的语文成绩按照年龄和成绩排序
  70. # db.grades.find({"grade.course_name": "语文"}).sort({"age": -1, "grade.score": -1});
  71. # db.grades.find({"grade.course_name": "语文"}).sort({"grade.score": -1, "age": -1});
  72.  
  73. # 按某一列排序
  74. # data_list = grades.find({"grade.course_name": "语文"}).sort("grade.score", DESCENDING);
  75. # for item in data_list:
  76. # print(item)
  77.  
  78. # 按多列排序
  79. data_list = grades.find({"grade.course_name": "语文"}).sort([('age', DESCENDING),("grade.score", DESCENDING),])
  80. for item in data_list:
  81. print(item)
  82.  
  83. def counter_students(self):
  84. """ 统计newdb中文档总数 """
  85. db = self.client.get_database('test')
  86. newdb = db.get_collection('newdb')
  87. # result = newdb.count_documents({})
  88. result = newdb.count_documents({"uname": {"$eq": "张三"}})
  89. print(result)
  90.  
  91. def test_aggregate(self):
  92. """
  93. 聚合统计:及格的学生成绩
  94. """
  95. db = self.client.get_database('test')
  96. grades = db.get_collection('grades')
  97. result = grades.aggregate([
  98. # //where
  99. {
  100. '$match': {"grade.score": {'$gte': 60}}
  101. },
  102. # //group by
  103. {
  104. '$group': {
  105. '_id': "$stu_no",
  106. 'total': {'$sum': 1}
  107. }
  108. },
  109. # // having
  110. {
  111. '$match': {
  112. 'total': {'$eq': 3}
  113. }
  114. }
  115. ])
  116. for item in result:
  117. print(item)
  118.  
  119.  
  120. if __name__ == '__main__':
  121. obj = LearnMongoDBSearch()
  122. # obj.search_one()
  123. # obj.search_user_by_pk('6411ee77b6170000b4003f95')
  124. # obj.search_many()
  125. # stu_list = obj.paginate(page=3)
  126. # for item in stu_list:
  127. # print(item)
  128.  
  129. # obj.sort_data()
  130. # obj.counter_students()
  131. obj.test_aggregate()
  132.  

四、更新文档

回顾,更新数据表达式,如下表所示:

修改一个文档,调用方法:

  1. update_one(filter, update, *args)

替换一个文档,调用方法:

  1. replace_one(filter, replacement, *args)

批量修改文档,调用方法:

  1. replace_one(filter, replacement, *args)

快捷方法:

  1. find_one_and_update(filter, update, *args) # 修改一个文档
  2. find_one_and_replace(filter, replacement, *args) # 替换一个文档
  3. # 注意返回值的不同

返回结果:

acknowledged:结果是否已经被确认
modified_count:修改的文档数
matched_count:满足条件的文档数
raw_result:原始数据
upserted_id:更新的ID (upsert=True)

示例代码:

  1. # -*- coding: utf-8 -*-
  2. # @Time : 2023-03-18 14:56
  3. # @Author : AmoXiang
  4. # @File : 4.修改文档.py
  5. # @Software: PyCharm
  6. # @Blog : https://blog.csdn.net/xw1680
  7.  
  8. from pymongo import MongoClient
  9.  
  10. class LearnMongoDBUpdate(object):
  11. """ MongoDB更新练习 """
  12.  
  13. def __init__(self):
  14. self.client = MongoClient()
  15.  
  16. def test_update_one(self):
  17. """ 更新一个文档 """
  18. db = self.client.get_database('test')
  19. newdb = db.get_collection('newdb')
  20. result = newdb.update_one({}, {'$set': {'likes': 70}})
  21. print(result.modified_count)
  22.  
  23. def test_replace_one(self):
  24. """ 替换一个文档 """
  25. db = self.client.get_database('test')
  26. newdb = db.get_collection('newdb')
  27. result = newdb.replace_one({}, {'uname': '张三'})
  28. print(result.modified_count)
  29.  
  30. def test_update_many(self):
  31. """ 批量更新文档 """
  32. db = self.client.get_database('test')
  33. newdb = db.get_collection('newdb')
  34. result = newdb.update_many({}, {'$set': {'likes': 90}})
  35. print('修改的数量:', result.modified_count)
  36. print('满足条件的数量:', result.matched_count)
  37.  
  38. def test_update_shortcut(self):
  39. """ 更新文档的快捷方法 """
  40. db = self.client.get_database('test')
  41. newdb = db.get_collection('newdb')
  42. # 此处返回一个文档对象
  43. result = newdb.find_one_and_update({}, {'$set': {'sex': '未知'}})
  44. print(result['_id'])
  45. if __name__ == '__main__':
  46. obj = LearnMongoDBUpdate()
  47. # obj.test_update_one()
  48. # obj.test_replace_one()
  49. # obj.test_update_many()
  50. obj.test_update_shortcut()
  51.  

五、删除文档

删除一个文档,调用方法如下:

  1. result = db.COLLECTION_NAME.delete_one(filter, *args)
  2. # 返回已经删除的记录数 result.deleted_count
  3. # 删除时返回文档对象
  4. find_one_and_delete(filter, *args)

批量删除文档,调用方法:

  1. result = db.COLLECTION_NAME.delete_many(filter, *args)
  2. # 返回已经删除的记录数
  3. result. deleted_count

示例代码:

  1. # -*- coding: utf-8 -*-
  2. # @Time : 2023-03-18 14:34
  3. # @Author : AmoXiang
  4. # @File : 3.删除文档.py
  5. # @Software: PyCharm
  6. # @Blog : https://blog.csdn.net/xw1680
  7.  
  8. from pymongo import MongoClient
  9.  
  10.  
  11. class LearnMongoDBDelete(object):
  12. """ MongoDB删除练习 """
  13.  
  14. def __init__(self):
  15. self.client = MongoClient()
  16.  
  17. def test_delete_one(self):
  18. """ 删除一个文档 """
  19. db = self.client.get_database('test')
  20. newdb = db.get_collection('newdb')
  21. result = newdb.delete_one({})
  22. print(result.deleted_count)
  23.  
  24. def test_delete_many(self):
  25. """ 批量删除文档 """
  26. db = self.client.get_database('test')
  27. users = db.get_collection('newdb')
  28. # 删除所有的数据
  29. result = users.delete_many({"likes": {"$lte": 90}})
  30. print(result.deleted_count)
  31.  
  32. def test_delete_shortcut(self):
  33. """ 删除文档的快捷方法 """
  34. db = self.client.get_database('test')
  35. newdb = db.get_collection('newdb')
  36. result = newdb.find_one_and_delete({})
  37. print(result['title'])
  38.  
  39.  
  40. if __name__ == '__main__':
  41. obj = LearnMongoDBDelete()
  42. # obj.test_delete_one()
  43. # obj.test_delete_shortcut()
  44. obj.test_delete_many()
  45.  

至此今天的学习就到此结束了,笔者在这里声明,笔者写文章只是为了学习交流,以及让更多学习数据库的读者少走一些弯路,节省时间,并不用做其他用途,如有侵权,联系博主删除即可。感谢您阅读本篇博文,希望本文能成为您编程路上的领航者。祝您阅读愉快!

到此这篇关于Python 操作 MongoDB ----非 ODM的文章就介绍到这了,更多相关Python 操作 MongoDB内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号