使用Python操作MongoDB数据库

目录

前言

MongoDB简介

基本概念

文档(Document):

集合(Collection):

数据库(Database):

BSON(Binary JSON):

特点

1. 高性能:

2. 可扩展性:

3. 高可用性:

4. 灵活性:

5. 易于使用:

应用场景

对比关系型数据库

数据模型

性能和扩展性

功能和特性

安全性

适用场景

MongoDB安装和配置

MongoDB的安装

MongoDB的配置

启动服务

权限认证

安装MongoDB系统服务

MongoDB可视化工具

使用文档

Python操作MongoDB

安装 pymongo

连接到 MongoDB

用户认证

插入数据

查询数据

更新数据

删除数据

使用文档

完善MongoDB工具类

结语


前言

 近期看到一篇关于DB-Engines数据库排名的文章,发现MongoDB高居总排名的第五名,而且是非关系型数据的的第一名,因此对MongoDB好很好奇,抱着学习的态度去研究一下这个超棒的技术。MongoDB 是一个基于分布式文件存储的数据库,旨在为WEB应用提供可扩展的高性能数据存储解决方案。它属于非关系型数据库(NoSQL),以其灵活的文档模型、强大的查询功能和高可用性而受到广泛欢迎。Python 作为一门强大的编程语言,通过 pymongo 这个库可以非常便捷地与 MongoDB 数据库进行交互。本文将着重介绍MongoDB的基本概念、并将其与关系型数据库进行对比、MongoDB数据库的安装和配置、使用 Python 和 pymongo 来连接 MongoDB 数据库,进行基本的增删改查(CRUD)操作,并在最后封装生成Python操作MongoDB的工具类。

MongoDB简介

MongoDB是一个开源、高性能、无模式的文档型数据库,它以其灵活的文档模型和高扩展性著称,是NoSQL数据库产品中的一种。以下是MongoDB的基本概念及特点:

基本概念

文档(Document)

  • MongoDB中的数据基本单位是文档,文档是一个由字段和值对(field:value)组成的数据结构,类似于JSON对象。
  • 文档中的字段可以是基本数据类型(如字符串、整数、浮点数等),也可以是其他文档、数组或文档数组,提供了极大的灵活性。

集合(Collection)

  • 集合是文档的集合,类似于关系型数据库中的表。
  • 集合中的文档结构不需要相同,即MongoDB是无模式的,这意味着它不需要在存储数据之前定义表结构。

数据库(Database)

  • MongoDB中的数据库是数据的容器,一个MongoDB实例可以包含多个独立的数据库。
  • 每个数据库都有独立的权限控制,可以创建、删除和修改数据库。

BSON(Binary JSON)

  • MongoDB使用BSON格式存储数据,BSON是一种类似JSON的二进制格式,具有轻量性、可遍历性和高效性。
  • BSON支持更多的数据类型,如Date和BinData类型,以及内嵌的文档对象和数组对象。

特点

1. 高性能

  • MongoDB采用内存映射文件的方式来管理数据,这可以大大提高数据的读写速度。
  • 支持索引,可以加快查询速度。

2. 可扩展性

  • MongoDB支持水平扩展,可以通过增加更多的服务器来扩展存储能力和查询性能。
  • 分片(Sharding)是MongoDB实现水平扩展的机制,它可以将数据分布在多个服务器上。

3. 高可用性

  • MongoDB通过副本集(Replica Set)实现高可用性,副本集包含多个节点,其中一个为主节点,其余为副节点。
  • 主节点处理写操作,副节点复制主节点的数据并在主节点故障时接管。

4. 灵活性

  • MongoDB的文档模型非常灵活,无需预定义表结构,可以存储复杂的数据类型。
  • 支持丰富的查询语言,包括嵌套查询和聚合操作。

5. 易于使用

  • MongoDB提供了简洁易用的接口,包括命令行工具和图形界面工具,方便用户进行数据库操作。
  • 支持多种编程语言,如Python、Java、C++等,方便开发者在项目中集成MongoDB。

应用场景

MongoDB适用于处理大规模的数据存储和查询需求,特别是在以下场景中表现优异:

  • 数据量大
  • 写入操作频繁(读写都很频繁)
  • 需要灵活的数据模型
  • 需要高可用性和可扩展性

例如,MongoDB在社交媒体、电子商务、物联网等领域有广泛的应用。

总之,MongoDB是一个功能强大、灵活易用的文档型数据库,它以其高性能、可扩展性和灵活性而受到广泛欢迎。随着大数据和云计算技术的不断发展,MongoDB的应用前景将更加广阔。

对比关系型数据库

在工作中主要使用MySQL数据库,所以这里主要对比MongoDB和MySQL数据库的异同。MongoDB是NoSQL数据库产品中的一种,MySQL是关系型数据库的一种,它们各自在数据模型、性能、功能、安全性等方面存在显著差异。以下是对MongoDB和MySQL的详细对比:

数据模型

  • MongoDB:MongoDB是一个文档型数据库,它将数据存储在类似JSON的文档中。这种数据模型提供了更高的灵活性和可扩展性,因为每个文档可以有不同的结构和字段。MongoDB的数据模型是动态的,同一个集合里的文档不需要有相同的字段和结构。
  • MySQL:MySQL是一个关系型数据库,它将数据存储在预先定义的表格中,每个表格有固定的列和数据类型。MySQL使用结构化查询语言(SQL)来操作数据,并可以通过主键和外键来建立表格之间的关联。MySQL的数据模型是静态的,需要预先定义字段。

性能和扩展性

  • MongoDB:MongoDB在处理大量非结构化数据时表现出色,因为它不需要进行数据的转换和映射,也不需要维护数据的一致性和完整性。MongoDB支持自动分片和复制,可以实现水平扩展,从而提高数据的可用性和容错性。此外,MongoDB对写入操作有较低的延迟,非常适合实时应用。
  • MySQL:MySQL在处理小量的结构化数据时表现优异,因为它可以利用索引和缓存来优化数据的检索和计算。MySQL也支持分区和复制来实现垂直扩展,但相比之下,其扩展性可能不如MongoDB那样灵活。

功能和特性

  • MongoDB:MongoDB支持高级功能,包括索引、聚合管道和分片,以提供强大的查询功能。它还支持一些新的特性,如内存限制、自动缓存和可插拔式存储引擎等。MongoDB可以处理大量动态数据,因为文档可以包含不同类型的数据。
  • MySQL:MySQL支持原始SQL语句,支持复杂的查询和复杂的事务处理。它还支持外部键,可以有效地关联两个表。MySQL拥有极佳的社区支持,有快速的解决方案。

安全性

  • MongoDB:MongoDB在安全方面相对较弱,因为它默认不启用身份验证和授权,也不支持复杂的事务处理。MongoDB的安全性主要依赖于网络的隔离和防护,以及传输层安全(TLS)和SSL的加密连接。MongoDB可以通过多文档事务来实现ACID的部分特性,但会牺牲速度和可用性。
  • MySQL:MySQL提供了更丰富和细致的安全功能,例如基于特权的安全模型、安全套接字层(SSL)、防火墙和审计插件等。MySQL也支持ACID(原子性、一致性、隔离性、持久性)的事务属性,以确保数据的有效性和完整性。

适用场景

  • MongoDB:更适合需要灵活方便地存储非结构化数据的场景,如大数据量、高并发、数据结构多变的场景,如互联网应用、物联网应用、大数据分析等。
  • MySQL:更适合结构化数据和需要事务支持的场景,如金融应用、电子商务应用、企业管理应用等,以及需要强一致性和复杂事务处理的场景,如银行系统、库存系统、订单系统等。

MongoDB安装和配置

MongoDB的安装

https://www.mongodb.com/try/download/community地址选择合适的版本下载MongoDB msi安装包。双击安装包直接安装,注意选择合适的安装目录,本人安装位置为:D:\mongoDB\目录下。

MongoDB的配置

启动服务

首先要在MongoDB的data文件夹里新建一个db文件夹和一个log文件夹,然后在log文件夹下新建一个mongo.log文件,然后将D:\mongoDB\bin添加到环境变量path中,接着在cmd窗口中运行如下命令就可以启动mongoDB服务:

mongod --dbpath D:\mongoDB\data\db

此时打开cmd窗口运行一下mongo命令即可连接上MongoDB服务。

权限认证

连接上MongoDB服务,执行如下命令,添加用户名和密码:

use admin
db.createUser({
    user: 'yourUsername',
    pwd: 'yourPassword',
    roles: [ { role: 'userAdminAnyDatabase', db: 'admin' } ]
})

接着打开D:\mongoDB\bin\mongod.cfg文件,打开如下配置:

security:
  authorization: enabled

这个配置是针对MongoDB的,它启用了MongoDB的权限认证。

接着启动MongoDB服务,使用如下命令:

mongod --config D:\mongoDB\bin\mongod.cfg --dbpath=D:\mongoDB\data --logpath=D:\mongoDB\data\mongodb.log

MongoDB服务启动成功,接着可以使用如下命令连接服务:

mongo -u user -p password123 --authenticationDatabase admin

安装MongoDB系统服务

但是如果每次都要这么启动服务的话也太麻烦了吧,这里你可以选择设置成开机自启动,也可以选择用命令net start mongodb来手动启动,这里我选择使用后者,具体方法如下:

mongod --config D:\mongoDB\bin\mongod.cfg --dbpath=D:\mongoDB\data --logpath=D:\mongoDB\data\mongodb.log -install -serviceName "MongoDB"

如果没有报错的话就说明成功添加到服务里了,可以使用win+R然后输入services.msc命令进行查看:

MongoDB可视化工具

本人习惯使用Navicat for MongoDB作为可视化工具,具体用法不再赘述,请自行搜索,这里直接上图:

Navicat下载链接

使用文档

详细的MongoDB操作请参考官方文档

Python操作MongoDB

安装 pymongo

首先,确保你的环境中已经安装了 MongoDB 数据库,并且它正在运行。然后,你需要安装 pymongo 库。在你的 Python 环境中,可以使用 pip 命令来安装:

pip install pymongo

连接到 MongoDB

使用 pymongo 连接到 MongoDB 数据库非常简单。以下是一个基本的连接示例:

from pymongo import MongoClient 
# 连接到本地 MongoDB 服务 
# 默认端口是 27017 
client = MongoClient('localhost', 27017) 

# 选择或创建数据库 
db = client['mydatabase'] # 如果数据库不存在,将会自动创建 
# 选择或创建集合 
collection = db['mycollection'] # 集合类似于关系数据库中的表

用户认证

from pymongo import MongoClient 
# 连接到本地 MongoDB 服务 
# 默认端口是 27017 
client = MongoClient(host='127.0.0.1', port=27017,username="admin",password="*****")

# 选择或创建数据库 
db = client['mydatabase'] # 如果数据库不存在,将会自动创建 
# 选择或创建集合 
collection = db['mycollection'] # 集合类似于关系数据库中的表

插入数据

在 MongoDB 中,文档是存储数据的基本单元,相当于关系数据库中的行。你可以使用 insert_one() 方法插入单个文档,或者使用 insert_many() 方法插入多个文档。

# 插入单个文档 
post = {"author": "John", "text": "My first blog post!", "tags": ["mongodb", "python", "pymongo"]} 
post_id = collection.insert_one(post).inserted_id 
print("Inserted post with ID:", post_id) 

# 插入多个文档 
posts = [ 
{"author": "Alice", "text": "Another post", "tags": ["web", "databases"]}, 
{"author": "Bob", "text": "Yet another post", "tags": ["developers", "blogging"]}, 
] 
collection.insert_many(posts)

查询数据

MongoDB 提供了丰富的查询接口。以下是一些基本示例:

# 查询所有文档 
for post in collection.find(): 
    print(post) 

# 使用查询条件 
for post in collection.find({"author": "John"}): 
    print(post) 

# 投影(只返回指定字段) 
for post in collection.find({}, {"_id": 0, "text": 1}): 
    print(post)

更新数据

使用 update_one() 或 update_many() 方法可以更新文档。

# 更新单个文档 
collection.update_one({"author": "John"}, {"$set": {"text": "Updated text"}}) 

# 更新多个文档 
collection.update_many({"tags": "mongodb"},{"$set": {"text": "MongoDB post updated"}})

删除数据

使用 delete_one() 或 delete_many() 方法可以删除文档。

collection.delete_one({"author": "Alice"}) 

# 删除多个文档 
collection.delete_many({"tags": "blogging"})

使用文档

详细的pymongo操作请参考官方文档

完善MongoDB工具类

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@Time    : 2024/7/19 下午3:19
@Author  : Bill Fang
@File    : MongoDBUtil.py
@Desc    :
"""
import pymongo

class MongoDBUtil:
    """
    MongoDB工具类
    """
    def __init__(self, ip="127.0.0.1", db_name=None, port=27017):
        """构造函数"""
        self.client = pymongo.MongoClient(host=ip, port=port,username="admin",password="****")

        self.database = self.client[db_name]
        print(self.database)

    def create_database(self, db_name):
        """创建数据库"""
        return self.client.get_database(db_name)

    def drop_database(self, db_name):
        """删除数据库"""
        return self.client.drop_database(db_name)

    def select_database(self, db_name):
        """使用数据库"""
        self.database = self.client[db_name]
        return self.database

    def get_database(self, db_name):
        """使用数据库"""
        # return self.client[db_name]
        return self.client.get_database(db_name)

    def list_database_names(self):
        """获取所有数据库列表"""
        return self.client.list_database_names()

    def create_collection(self, collect_name):
        """创建集合"""
        collect = self.database.get_collection(collect_name)
        if(collect is not None):
            print("collection %s already exists" % collect_name)
            return collect
        return self.database.create_collection(collect_name)

    def drop_collection(self, collect_name):
        """获取所有集合名称"""
        return self.database.drop_collection(collect_name)

    def get_collection(self, collect_name):
        """获取集合"""
        return self.database.get_collection(collect_name)

    def list_collection_names(self):
        """获取所有集合名称"""
        return self.database.list_collection_names()

    def insert(self, collect_name, documents):
        """插入单条或多条数据"""
        return self.database.get_collection(collect_name).insert(documents)

    def insert_one(self, collect_name, document):
        """插入一条数据"""
        return self.database.get_collection(collect_name).insert_one(document)

    def insert_many(self, collect_name, documents):
        """插入多条数据"""
        return self.database.get_collection(collect_name).insert_many(documents)

    def delete_one(self, collect_name, filter, collation=None, hint=None, session=None):
        """删除一条记录"""
        return self.database.get_collection(collect_name).delete_one(filter, collation, hint, session)

    def delete_many(self, collect_name, filter, collation=None, hint=None, session=None):
        """删除所有记录"""
        return self.database.get_collection(collect_name).delete_many(filter, collation, hint, session)

    def find_one_and_delete(self, collect_name, filter, projection=None, sort=None, hint=None, session=None, **kwargs):
        """查询并删除一条记录"""
        return self.database.get_collection(collect_name).find_one_and_delete(filter, projection, sort, hint, session, **kwargs)

    def count_documents(self, collect_name, filter, session=None, **kwargs):
        """查询文档数目"""
        return self.database.get_collection(collect_name).count_documents(filter, session, **kwargs)

    def find_one(self, collect_name, filter=None, *args, **kwargs):
        """查询一条记录"""
        return self.database.get_collection(collect_name).find_one(filter, *args, **kwargs)

    def find(self, collect_name, *args, **kwargs):
        """查询所有记录"""
        return self.database.get_collection(collect_name).find(*args, **kwargs)

    def update(self, collect_name, spec, document, upsert=False, manipulate=False,
               multi=False, check_keys=True, **kwargs):
        """更新所有记录"""
        return self.database.get_collection(collect_name).update(spec, document,
                                upsert, manipulate, multi, check_keys, **kwargs)

    def update_one(self, collect_name, filter, update, upsert=False, bypass_document_validation=False,
                                collation=None, array_filters=None, hint=None, session=None):
        """更新一条记录"""
        return self.database.get_collection(collect_name).update_one(filter, update,
                                upsert, bypass_document_validation, collation, array_filters, hint, session)

    def update_many(self, collect_name, filter, update, upsert=False, array_filters=None,
                                bypass_document_validation=False, collation=None, hint=None, session=None):
        """更新所有记录"""
        return self.database.get_collection(collect_name).update_many(filter, update,
                                upsert, array_filters, bypass_document_validation, collation, hint, session)

    def find_one_and_update(self, collect_name, filter, update, projection=None, sort=None, upsert=False,
                           return_document=False, array_filters=None, hint=None, session=None, **kwargs):
        """查询并更新一条记录"""
        return self.database.get_collection(collect_name).find_one_and_update(filter, update, projection,
                                sort, upsert, return_document, array_filters, hint, session, **kwargs)

结语

以上就是使用Python操作MongoDB数据库的基本介绍。通过PyMongo库,我们可以轻松地实现数据库的增删改查等操作。希望这篇博客对大家有所帮助,也期待大家在学习和使用MongoDB的过程中,能够创造出更多有趣和实用的应用!

  • 22
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值