展开菜单
首页 精品内容 本月促销 装机必备 Windows macOS软件 IOS软件 Android AI PDF教程 专题
全部分类

当前位置:

首页 > 编程开发 > Python怎么操作MongoDB数据库

Python怎么操作MongoDB数据库

一、连接器的安装和配置pymongo:MongoDB官方提供的Python工具包。官方文档:https://pymongo.readthedocs.io/en/stable/pip安装,命令如下:pipinstallpymongo管理MongoDB的主要步骤如下:连接到MongoDB数据库系统管理MongoDB数据库管理MongoDB中的集合管理MongoDB中的文档第一步,连接MongoDB:#方式一:使用默认的配置client=MongoClient()#方式二:指定主机地址和端口号client=Mo

一、连接器的安装和配置

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

pip install pymongo

管理 MongoDB 的主要步骤如下:

  • 连接到 MongoDB 数据库系统

  • 管理 MongoDB 数据库

  • 管理 MongoDB 中的集合

  • 管理 MongoDB 中的文档

第一步,连接 MongoDB:

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

第二步,管理数据库:

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

第三步,管理集合

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

基础操作示例:

# -*- coding: utf-8 -*-
# @Time    : 2023-03-17 1:47
# @Author  : AmoXiang
# @File    : 1.数据库连接.py
# @Software: PyCharm
# @Blog    : https://blog.csdn.net/xw1680

from pymongo import MongoClient

# 使用默认配置连接到数据库
# client = MongoClient()
# print(client)
# client.close()
# 指定主机地址和端口号连接到数据库
# client = MongoClient('localhost', 27017)
# 使用URI连接参数连接到数据库
client = MongoClient('mongodb://localhost:27017/')
print(client)
# client.close()
#
# # 访问数据库
# db = client.test
# db = client["test"]
# print(db)
# db = client.get_database('test')
# client.close()
# print(db)
#
# 查看有哪些数据库
db_list = client.list_databases()
# # db_list = client.list_database_names()
for item in db_list:
    print(item)
#
# 查看数据库下有哪些集合
db_test = client["test"]
for item in db_test.list_collection_names():
    print(item)
#
# # 集合对象操作
# data = db_test.students.find_one()
# data = client.test.students.find_one()
data = client.test.get_collection('students').find_one()
print(data)

二、新增文档

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

insert_one():插入一个文档

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

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

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

示例:

三、查询文档

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

常用方法:

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

示例代码:

# -*- coding: utf-8 -*-
# @Time    : 2023-03-18 15:03
# @Author  : AmoXiang
# @File    : 5.查询文档.py
# @Software: PyCharm
# @Blog    : https://blog.csdn.net/xw1680

from bson.objectid import ObjectId
from pymongo import MongoClient, ASCENDING, DESCENDING


class LearnMongoDBSearch(object):
    """ MongoDB查询练习 """

    def __init__(self):
        self.client = MongoClient()

    def search_one(self):
        """ 查询一个文档 """
        temp_obj = self.client.test.newdb.find_one()
        print(temp_obj)
        print('喜欢分数:', temp_obj['likes'])
        # print('注册时间:', temp_obj['reg_date'].date())
        print('姓名:', temp_obj['uname'])

    def search_user_by_pk(self, pk):
        obj_id = ObjectId(pk)
        # user_obj = self.client.test.newdb.find_one({'_id': obj_id})
        # 面向对象的方法,有代码提示
        db = self.client.get_database('test')
        users = db.get_collection('newdb')
        user_obj = users.find_one({'_id': obj_id})
        print(user_obj)

    def search_many(self):
        """ 查询多个文档 """
        db = self.client.get_database('test')
        students = db.get_collection('students')
        # stu_list = students.find()
        # for item in stu_list:
        #     print(item)

        # 查询年龄大于12岁的学生
        stu_list = students.find({'age': {'$gt': 12}}, {'stu_name': 1, 'class_name': 1, 'age': 1})
        for item in stu_list:
            # 注意:  mongo中存储的整数转换成了浮点数
            print(item)

    def paginate(self, page=1, page_size=10):
        """
        分页处理
        :param page: 当前的页
        :param page_size: 每一页数据大小
        :return:
        """
        db = self.client.get_database('test')
        students = db.get_collection('students')
        offset = (page - 1) * page_size
        stu_list = students.find().skip(offset).limit(page_size)
        return stu_list

    def sort_data(self):
        """ 排序 """
        db = self.client.get_database('test')
        grades = db.get_collection('grades')
        # // 将学生的语文成绩从高到低排序
        # db.grades.find({"grade.course_name": "语文"}).sort({"grade.score": -1});
        #
        # //将学生的语文成绩按照年龄和成绩排序
        # db.grades.find({"grade.course_name": "语文"}).sort({"age": -1, "grade.score": -1});
        # db.grades.find({"grade.course_name": "语文"}).sort({"grade.score": -1, "age": -1});

        # 按某一列排序
        # data_list = grades.find({"grade.course_name": "语文"}).sort("grade.score", DESCENDING);
        # for item in data_list:
        #     print(item)

        # 按多列排序
        data_list = grades.find({"grade.course_name": "语文"}).sort([('age', DESCENDING),("grade.score", DESCENDING),])
        for item in data_list:
            print(item)

    def counter_students(self):
        """ 统计newdb中文档总数 """
        db = self.client.get_database('test')
        newdb = db.get_collection('newdb')
        # result = newdb.count_documents({})
        result = newdb.count_documents({"uname": {"$eq": "张三"}})
        print(result)

    def test_aggregate(self):
        """
        聚合统计:及格的学生成绩
        """
        db = self.client.get_database('test')
        grades = db.get_collection('grades')
        result = grades.aggregate([
            # //where
            {
                '$match': {"grade.score": {'$gte': 60}}
            },
            # //group by
            {
                '$group': {
                    '_id': "$stu_no",
                    'total': {'$sum': 1}
                }
            },
            # // having
            {
                '$match': {
                    'total': {'$eq': 3}
                }
            }
            ])
        for item in result:
            print(item)


if __name__ == '__main__':
    obj = LearnMongoDBSearch()
    # obj.search_one()
    # obj.search_user_by_pk('6411ee77b6170000b4003f95')
    # obj.search_many()
    # stu_list = obj.paginate(page=3)
    # for item in stu_list:
    #     print(item)

    # obj.sort_data()
    # obj.counter_students()
    obj.test_aggregate()

四、更新文档

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

Python怎么操作MongoDB数据库

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

update_one(filter, update, *args)

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

replace_one(filter, replacement, *args)

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

replace_one(filter, replacement, *args)

快捷方法:

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

返回结果:

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

示例代码:

# -*- coding: utf-8 -*-
# @Time    : 2023-03-18 14:56
# @Author  : AmoXiang
# @File    : 4.修改文档.py
# @Software: PyCharm
# @Blog    : https://blog.csdn.net/xw1680

from pymongo import MongoClient

class LearnMongoDBUpdate(object):
    """ MongoDB更新练习 """

    def __init__(self):
        self.client = MongoClient()

    def test_update_one(self):
        """ 更新一个文档 """
        db = self.client.get_database('test')
        newdb = db.get_collection('newdb')
        result = newdb.update_one({}, {'$set': {'likes': 70}})
        print(result.modified_count)

    def test_replace_one(self):
        """ 替换一个文档 """
        db = self.client.get_database('test')
        newdb = db.get_collection('newdb')
        result = newdb.replace_one({}, {'uname': '张三'})
        print(result.modified_count)

    def test_update_many(self):
        """ 批量更新文档 """
        db = self.client.get_database('test')
        newdb = db.get_collection('newdb')
        result = newdb.update_many({}, {'$set': {'likes': 90}})
        print('修改的数量:', result.modified_count)
        print('满足条件的数量:', result.matched_count)

    def test_update_shortcut(self):
        """ 更新文档的快捷方法 """
        db = self.client.get_database('test')
        newdb = db.get_collection('newdb')
        # 此处返回一个文档对象
        result = newdb.find_one_and_update({}, {'$set': {'sex': '未知'}})
        print(result['_id'])
if __name__ == '__main__':
    obj = LearnMongoDBUpdate()
    # obj.test_update_one()
    # obj.test_replace_one()
    # obj.test_update_many()
    obj.test_update_shortcut()

五、删除文档

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

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

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

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

示例代码:

# -*- coding: utf-8 -*-
# @Time    : 2023-03-18 14:34
# @Author  : AmoXiang
# @File    : 3.删除文档.py
# @Software: PyCharm
# @Blog    : https://blog.csdn.net/xw1680

from pymongo import MongoClient


class LearnMongoDBDelete(object):
    """ MongoDB删除练习 """

    def __init__(self):
        self.client = MongoClient()

    def test_delete_one(self):
        """ 删除一个文档 """
        db = self.client.get_database('test')
        newdb = db.get_collection('newdb')
        result = newdb.delete_one({})
        print(result.deleted_count)

    def test_delete_many(self):
        """ 批量删除文档 """
        db = self.client.get_database('test')
        users = db.get_collection('newdb')
        # 删除所有的数据
        result = users.delete_many({"likes": {"$lte": 90}})
        print(result.deleted_count)

    def test_delete_shortcut(self):
        """ 删除文档的快捷方法 """
        db = self.client.get_database('test')
        newdb = db.get_collection('newdb')
        result = newdb.find_one_and_delete({})
        print(result['title'])


if __name__ == '__main__':
    obj = LearnMongoDBDelete()
    # obj.test_delete_one()
    # obj.test_delete_shortcut()
    obj.test_delete_many()
本文内容来源于互联网,如有侵权请联系删除。
作者最新文章
编程开发 MongoDB Python
相关文章 更多
精品专题 更多
本月促销

正软商城本月促销专区,汇集办公、设计、安全、影音、系统工具及AI软件等正版软件优惠活动,提供限时折扣、特价授权和优惠购买信息,活动库存及价格以页面实时展示为准。

装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

IOS软件

正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

AI

正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

Mac软件 更多
灵活计算器
灵活计算器

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

赤友清理大师
赤友清理大师

赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

极度公式
极度公式

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

图几
图几

图几是一款适用于 macOS 的截图、标注与美化工具,支持离线操作保障隐私。界面整理和高频系统操作被放到一起考虑,桌面或窗口内容一多时,管理起来会更省心。

密码键盘
密码键盘

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

思源笔记
思源笔记

思源笔记是一款本地笔记软件,提供所见即所得的编辑方式,为长文写作带来顺滑的体验。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

Office 365 简体中文
Office 365 简体中文

一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。

WALTR PRO
WALTR PRO

WALTR是一款电脑至iOS文件传输转换工具,操作简单,快速实现文件识别与传送。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

CodeExpander
CodeExpander

CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。

Mountain Duck
Mountain Duck

Mountain Duck 是一款能将多个网盘挂载到本地的工具,像本地磁盘一样使用网盘。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

Menuist
Menuist

Menuist 是一款面向 macOS 的 Finder 右键菜单增强工具,主要用来补充新建文件、快捷导航等常用操作,让日常文件管理和访问路径时更高效、更顺手。

Mole
Mole

Mole 是一款专为 Mac 设计的深度清理优化工具,涵盖缓存清理、应用管理及实时状态监控等功能。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

WINDOWS 更多
Windows 10
Windows 10

Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

极度公式
极度公式

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

密码键盘
密码键盘

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

思源笔记
思源笔记

思源笔记是一款本地笔记软件,提供所见即所得的编辑方式,为长文写作带来顺滑的体验。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

傲梅轻松备份
傲梅轻松备份

傲梅轻松备份是一款专业易用的数据备份软件,为重要数据提供安全保障。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

Office 365 简体中文
Office 365 简体中文

一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。

Wise Folder Hider Pro
Wise Folder Hider Pro

Wise Folder Hider Pro 是一款专业级文件和文件夹隐藏加密软件,为私密数据添加多重保护。高频操作更强调就近处理,浏览、整理和跨目录移动文件时,来回切换和重复点击都会少很多。

WALTR PRO
WALTR PRO

WALTR是一款电脑至iOS文件传输转换工具,操作简单,快速实现文件识别与传送。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

CodeExpander
CodeExpander

CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。

PinStack
PinStack

PinStack是一款轻量级的Windows平台剪贴板管理工具,优化您的剪贴板使用体验。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

Mountain Duck
Mountain Duck

Mountain Duck 是一款能将多个网盘挂载到本地的工具,像本地磁盘一样使用网盘。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

Seer
Seer

Seer是一款在Win平台下的空格键功能增强效率工具,只需轻敲空格键,就能预览几乎任何格式的文件。它更适合把零散的小功能集中起来使用,处理高频琐碎任务时会更省事。