在Python中使用MongoDB
目录
先决条件
PyMongo实现
创建操作
读取操作
更新操作
删除操作
MongoEngine实现
创建操作
读取操作
更新操作
删除操作
结论
在我们的《MongoDB定义指南》中,我们涵盖了很多基础。在这里,您可以获得有关NoSQL 数据库,它们是什么,如何使用它们以及使用它们的好处的更多信息。除此之外,您还可以找到有关不同类型的NoSQL数据库及其最受欢迎的代表的更多信息。这些类型之一是所谓的Document NoSQL数据库,它们最受欢迎的代表是MongoDB。
因此,我们继续介绍了该数据库的一些基础 。在那里,您可以学习如何安装MongoDB,创建数据库、集合、文档以及如何使用这些实体。另外,还有许多有关MongoDB 部署、分片、副本集以及如何操作它们的信息。您也可以找到如何在.NET环境、JavaScript MEAN框架和无服务器 环境中使用此数据库。因此,我们希望以此为基础,并写一篇文章,介绍如何在Python中使用MongoDB 。
在本文中,我们实现了一个存储库,您可以使用该存储库来处理Users组中的数据。我们在.NET的《MongoDB定义指南》中做了类似的事情。实际上,我们提出了两种实现方法,即,使用两个Python模块——PyMongo和MongoEngine。第一个库PyMongo的实现是低级别的实现,而MongoEngine的实现可以看作是更高级别的实现。但是,在深入了解每个实现的细节之前,让我们先安装MongoDB和两个Python模块。
先决条件
MongoDB是免费和开源的。可以从这里下载。获取版本和您的操作系统之后。在这个例子中,我们为Windows系统使用MongoDB的4.2.1社区服务器。
安装后,用户可以使用以下命令运行MongoDB 服务器:
mongod –dbpath PATH_TO_THE_DIR
通过此安装,还将安装MongoCompass。这是可视化的GUI 组件,您可以使用它来操纵数据库、集合和文档:
就这些示例而言,我们使用本地数据库和用户集合:
正如我们提到的,您将需要两个Python 模块,因此让我们安装它们。首先,您可以像这样安装PyMongo:
pip install pymongo
之后安装MongoEngine:
pip install mongoengine
就是这样。我们已准备好实现。
PyMongo实现
让我们实现使用PyMongo 模块的UserRepository类。更准确地说,我们只需要该模块中的一个类——MongoClient:
from pymongo import MongoClient
在UserRepository的构造,我们创建了一个MongoClient的实例并连接到群集。有几种方法可以实现,而在代码中可以看到两种方法。然后选择数据库和集合。该实现的其余部分更不只是包装self._user字段中的函数。
class UserRepository(object):def __init__(self):mongoclient = MongoClient('localhost', 27017)#mongoclient = MongoClient('mongodb://localhost:27017')database = mongoclient.localself._users = database.user
现在,我们可以创建此类的对象,如下所示:
user_repo = UserRepository()
创建操作
接下来,我们实现创建 操作。我们添加了两个方法:insert和insert_many。第一种方法仅将一个用户添加到集合中,而另一种方法从提供的array中添加所有用户。我们可以看到,下面他们只是从PyMongo中利用函数insert_one和insert_many。
class UserRepository(object):def __init__(self):mongoclient = MongoClient('localhost', 27017)#mongoclient = MongoClient('mongodb://localhost:27017')database = mongoclient.localself._users = database.user# Create operationsdef insert(self, user):return self._users.insert_one(user)def insert_many(self, users):return self._users.insert_many(users)
现在,我们可以从对象中使用这些功能。方法insert可以这样使用:
user = {'name':"Rubik",'age':33,'blog':"rubikscode.net"
}result = user_repo.insert(user)
print(result.acknowledged)
当我们使用MongoDB Compass peek此集合时,我们可以看到该文档是在用户集合中创建的。
而insert_many可以这样使用:
user_1 = {'name':"Vanja",'age':29,'blog':"eventroom.org"
}user_2 = {'name':"Marko",'age':36,'blog':"rubikscode.net"
}result = user_repo.insert_many([user_1, user_2])
print(result.acknowledged)
再次使用MongoDB Compass检查此操作的结果:
读取操作
太酷了,现在我们可以将文档添加到集合中了,让我们实现能够检索此信息的函数。我们添加了三个新函数:read_all,read_many和read。函数read_all 返回集合中的所有文档。方法read和read_many相似,它们都接受某种条件。但是,第一个仅返回一个满足条件的文档,而其他则返回所有满足条件的文档。
class UserRepository(object):def __init__(self):mongoclient = MongoClient('localhost', 27017)#mongoclient = MongoClient('mongodb://localhost:27017')database = mongoclient.localself._users = database.user# Create operationsdef insert(self, user):return self._users.insert_one(user)def insert_many(self, users):return self._users.insert_many(users)# Read operationsdef read_all(self):return self._users.find()def read_many(self, conditions):return self._users.find(conditions)def read(self, conditions):return self._users.find_one(conditions)
这些函数可以这样使用 :
print("---Read All---")
all_users = user_repo.read_all()for user in all_users:print(user)
print("--------------\n")print("---Read Many--")
rc_users = user_repo.read_many({'blog':'rubikscode.net'})for user in rc_users:print(user)
print("--------------\n")print("--- Read ---")
one_rc_user = user_repo.read({'blog':'rubikscode.net'})print(one_rc_user)
print("--------------\n")
而输出是这样的:
—Read All—
{‘_id’: ObjectId(‘5dbad5a4dde338d6e1cd3ea7’), ‘name’: ‘Rubik’, ‘age’: 33, ‘blog’: ‘rubikscode.net’}
{‘_id’: ObjectId(‘5dbc2f46ac3310f0215ba277’), ‘name’: ‘Vanja’, ‘age’: 29, ‘blog’: ‘eventroom.org’}
{‘_id’: ObjectId(‘5dbc2f46ac3310f0215ba278’), ‘name’: ‘Marko’, ‘age’: 36, ‘blog’: ‘rubikscode.net’}
————–—Read Many–
{‘_id’: ObjectId(‘5dbad5a4dde338d6e1cd3ea7’), ‘name’: ‘Rubik’, ‘age’: 33, ‘blog’: ‘rubikscode.net’}
{‘_id’: ObjectId(‘5dbc2f46ac3310f0215ba278’), ‘name’: ‘Marko’, ‘age’: 36, ‘blog’: ‘rubikscode.net’}
————–— Read —
{‘_id’: ObjectId(‘5dbad5a4dde338d6e1cd3ea7’), ‘name’: ‘Rubik’, ‘age’: 33, ‘blog’: ‘rubikscode.net’}
————–
更新操作
我们实现了两种更新方法:update和gain_age。第一个目的是演示如何使用条件更新单个文档。另一个功能演示如何将MongoDB更新修饰符封装在函数中,并根据需要定制存储库。可以说,这是这种方法的最大优势。
class UserRepository(object):def __init__(self):mongoclient = MongoClient('localhost', 27017)#mongoclient = MongoClient('mongodb://localhost:27017')database = mongoclient.localself._users = database.user# Create operationsdef insert(self, user):return self._users.insert_one(user)def insert_many(self, users):return self._users.insert_many(users)# Read operationsdef read_all(self):return self._users.find()def read_many(self, conditions):return self._users.find(conditions)def read(self, conditions):return self._users.find_one(conditions)# Update operationsdef update(self, conditions, new_value):return self._users.update_one(conditions, new_value)def increment_age(self, conditions):return self._users.update_one(conditions, {'$inc' : {'age' : 1}})
函数update可用于更新文档名称,如下所示:
result = user_repo.update({'name':'Rubik'}, {'$set': {'name': "Nikola"}})
print(result.acknowledged)
该结果是这样的:
方法 crement_age 更易于使用:
result = user_repo.increment_age({'name':'Nikola'})
print(result.acknowledged)
结果可以在MongoDB Compass中观察到:
删除操作
就像我们可以一次创建一个或多个文档一样,我们可以删除一个或多个文档。这使用两个函数完成:delete和delete_many。这两个函数均接收删除条件。以下是UserRepository类的最终形式:
class UserRepository(object):def __init__(self):mongoclient = MongoClient('localhost', 27017)#mongoclient = MongoClient('mongodb://localhost:27017')database = mongoclient.localself._users = database.user# Create operationsdef insert(self, user):return self._users.insert_one(user)def insert_many(self, users):return self._users.insert_many(users)# Read operationsdef read_all(self):return self._users.find()def read_many(self, conditions):return self._users.find(conditions)def read(self, conditions):return self._users.find_one(conditions)# Update operationsdef update(self, conditions, new_value):return self._users.update_one(conditions, new_value)def increment_age(self, conditions):return self._users.update_one(conditions, {'$inc' : {'age' : 1}})# Delete operationsdef delete(self, condition):return self._users.delete_one(condition)def delete_many(self, condition):return self._users.delete_many(condition)
如果要删除一个文档,可以这样操作:
result = user_repo.delete({'name':'Nikola'})
print(result.acknowledged)
该操作的结果:
在演示删除多个文档的样子之前,我们添加一个刚删除的文档并以先前状态还原集合:
如果在此之后,我们调用delete_many,则如下所示:
result = user_repo.delete_many({'blog':'rubikscode.net'})
print(result.acknowledged)
操作结果:
MongoEngine实现
如您所见,使用PyMongo实现存储库非常容易且有趣。但是,许多用户并不需要深入到这种低层次的抽象。这就是为什么有些人选择使用在PyMongo——MongoEngine之上构建库的原因。本质上,MongoEngine 是ODM,即,对象文档映射器。就像我们有关系数据库的ORM 一样,对于文档NoSQL数据库,我们也有ODM。MongoEngine提供了所需的更高级别的抽象。因此,让我们将其导入并附加到我们的数据库中:
from mongoengine import * connect('local', host='localhost', port=27017)
该函数的第一个参数是数据库的名称,而其他两个参数则定义location。为了“附加”到集合,我们需要实现一个类,该类描述该集合-模型的文档。这非常类似于我们在各种ORM中执行此操作的方式,因此,如果您有使用EntityFramework的经验,这对您来说自然而然的。模型类必须继承Document。 对于我们的用户集合,如下所示:
class User(Document):name = StringField(required=True, max_length=50)age = IntField(required=True)blog = StringField(required=True, max_length=50)
在此模型中,我们告诉MongoEngine 我们希望用户拥有姓名,年龄 和博客。 在下面,文档 基础对象将验证提供的数据。MongoEngine提供了各种字段类型 (这里我们仅使用StringField和IntField)以及这些类型的选项 。
创建操作
当我们实现User模型类时,使用它来操作数据库对象是很容易的。这是我们如何在用户 集合中创建文档的方法:
user = User(name = "Rubik",age = 33,blog = "rubikscode.net")# Create Operation
user.save()
请注意,在这种特殊情况下,保存 方法会在用户集合中创建文档。
读取操作
读取数据也得到了简化。这是完成的过程:
read_users = User.objectsfor user in User.objects:print("Name: {}; Age: {}; Blog: {}".format(user.name, user.age, user.blog))
使用对象字段,我们可以访问数据库中的所有文档。在这种情况下,只有一个:
Name: Rubik; Age: 33; Blog: rubikscode.net
如果我们要创建各种查询,则可以在此之上使用过滤器功能。
更新操作
使用保存方法对现有对象再次进行更新。基本上,当您第一次调用save方法时,它将创建一个文档,而第二次它将对其进行更新 。
user.name = "Marko"# Update
user.save()
结果:
删除操作
只需通过在User 对象上调用delete方法 即可执行删除操作 。
user.delete()
该结果是这样的:
结论
在本文中,我们有机会看到了如何在Python中使用MongoDB。我们可以看到它们具有相当的可比性, 并且可以很好地协同工作。我们使用了两个模块PyMongo和MongoEngine,因此根据您需要的抽象级别,可以选择最适合您的项目的一个。
在Python中使用MongoDB相关推荐
- MongoDB数据库(8.Python中使用mongodb数据库以及pymongo模块用法)
在Python中使用MongoDB数据库,首先要下载pymongo模块 直接在命令行 pip install pymongo 就可以了 Python中使用pymongo模块对MongoDB数据 ...
- python 中使用mongodb的封装
from pymongo import MongoClientclass MongoHelp(object):"""mongodb增删改查的操作""& ...
- python连接mongodb进行查询_Python中的MongoDB基本操作:连接、查询实例
MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可护展的高性能数据存储解决方案.它的特点是高性能.易部署.易使用,存储数据非常方便. MongoDB 简单使用 联 ...
- python执行shell脚本、执行mongodb_Mongo shell 的基本操作和 Python shell 中使用 MongoDB...
Mongo shell 的基本操作 MongoDB 分四级存储: 1.数据库 db 2.文档集合 collections(相当于 MySQL 的数据库表) 3.文档 document(相当于 MySQ ...
- mongodb python 大于_Python中使用MongoDB详解
作者:Zarten知乎专栏:Python爬虫深入详解知乎ID: Zarten简介: 互联网一线工作者,尊重原创并欢迎评论留言指出不足之处,也希望多些关注和点赞是给作者最好的鼓励 ! 介绍 MongoD ...
- mongodb创建用户名和密码_Python中使用MongoDB详解
作者:Zarten知乎专栏:Python爬虫深入详解知乎ID: Zarten简介: 互联网一线工作者,尊重原创并欢迎评论留言指出不足之处,也希望多些关注和点赞是给作者最好的鼓励 ! 介绍 MongoD ...
- python中文文档-Python语言、主要工具与类库中文文档
Python是Guido van Rossum在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言. Python 提供了非常完善的基础代码库,覆盖了网络.文件.GUI.数据库.文本等大量 ...
- python中Mongodb的Objectid 实现
python中Mongodb的Objectid 实现 Mongodb 作为非关系型数据库,默认实现 了Objectid 作为索引,对数据进行排序. ojbectid 组成 在 ObjectId 类中, ...
- spring mysql mongdb_Spring Boot中使用MongoDB数据库的方法
MongoDB数据库简介 简介 MongoDB是一个高性能,开源,无模式的,基于分布式文件存储的文档型数据库,由C++语言编写,其名称来源取自"humongous",是一种开源的文 ...
最新文章
- eDRX中的Paging
- 第4章-无人车UGV模型分析
- KubeEdge vs K3S:Kubernetes在边缘计算场景的探索
- python 计时器 timeit repeat 计算(语句)(函数)耗时 时间 运行时长
- JSON 是什么?它能带来什么?它和 XML 比较?
- Codeforces Round #374 (Div. 2) A. One-dimensional Japanese Crosswor 水题
- linux上 arm开发环境搭建,详解 LINUX下QT For ARM开发环境搭建过程
- mysql bit php,Bit Web Server (PHP,MySQL,PMA) 安卓WEB服务器
- 11.python之线程,协程,进程,
- asp.net core 系列 10 配置configuration (上)
- Python实现微信自动抠图换底助手
- 使用ps删除多余的内容
- 老毛子 K2 通过SSH 抓包
- android wifi信号检测
- mysql安装步骤图解5.0_MySQL5.0安装图解
- python读写excel的图片_Python读取excel中的图片完美解决方法
- 亚马逊云服务(AWS)机器学习服务Amazon SageMaker发力中国
- JS 进阶 (六) 浏览器事件模型DOM操作
- 力扣 (LeetCode)-对称二叉树,树|刷题打卡
- 情态动词+have+done用法整理
热门文章
- linux 临时 目录权限,linux文件和目录权限的设置
- c++hello world代码_在Rust代码中编写Python是种怎样的体验?
- echo输出换行_Bash shell教程[5] echo命令
- java11新特性_Java11 发布前抓紧掌握这些新特性
- 海报样机模型帮助以专业的方式展示你的设计
- 高端中餐美食餐饮海报PSD模板,看着就有食欲
- UI设计干货模板|输入框设计临摹素材
- 护理在计算机的应用研究,计算机虚拟和模拟技术在护理实践教学中应用的研究...
- mysql 流量带宽_流量与带宽
- Intel处理器家族和分类