目次
前言
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 下令来安装:
连接到 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的过程中,能够创造出更多风趣和实用的应用!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |