ToB企服应用市场:ToB评测及商务社交产业平台
标题:
使用Python操作MongoDB数据库
[打印本页]
作者:
宁睿
时间:
2024-11-27 18:59
标题:
使用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的部门特性,但会牺牲速度和可用性。
MySQ
L: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的过程中,能够创造出更多风趣和实用的应用!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4