目录

先决条件

PyMongo实现

创建操作

读取操作

更新操作

删除操作

MongoEngine实现

创建操作

读取操作

更新操作

删除操作

结论


在我们的MongoDB定义指南》中,我们涵盖了很多基础。在这里,您可以获得有关NoSQL 数据库,它们是什么,如何使用它们以及使用它们的好处的更多信息。除此之外,您还可以找到有关不同类型的NoSQL数据库及其最受欢迎的代表的更多信息。这些类型之一是所谓的Document  NoSQL数据库,它们最受欢迎的代表是MongoDB

因此,我们继续介绍了该数据库的一些基础 。在那里,您可以学习如何安装MongoDB,创建数据库、集合、文档以及如何使用这些实体。另外,还有许多有关MongoDB 部署、分片、副本集以及如何操作它们的信息。您也可以找到如何在.NET环境、JavaScript MEAN框架和无服务器 环境中使用此数据库。因此,我们希望以此为基础,并写一篇文章,介绍如何在Python使用MongoDB 

在本文中,我们实现了一个存储库,您可以使用该存储库来处理Users组中的数据。我们在.NET的《MongoDB定义指南》中做了类似的事情。实际上,我们提出了两种实现方法,即,使用两个Python模块——PyMongoMongoEngine。第一个库PyMongo的实现是低级别的实现,而MongoEngine的实现可以看作是更高级别的实现。但是,在深入了解每个实现的细节之前,让我们先安装MongoDB和两个Python模块。

先决条件

MongoDB是免费和开源的。可以从这里下载。获取版本和您的操作系统之后。在这个例子中,我们为Windows系统使用MongoDB4.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()

创建操作

接下来,我们实现创建 操作。我们添加了两个方法:insertinsert_many。第一种方法仅将一个用户添加到集合中,而另一种方法从提供的array添加所有用户。我们可以看到,下面他们只是从PyMongo利用函数insert_oneinsert_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_allread_manyread。函数read_all  返回集合中的所有文档。方法readread_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’}
————–

更新操作

我们实现了两种更新方法:updategain_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观察到:

删除操作

就像我们可以一次创建一个或多个文档一样,我们可以删除一个或多个文档。这使用两个函数完成:deletedelete_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数据库,我们也有ODMMongoEngine提供了所需的更高级别的抽象。因此,让我们将其导入并附加到我们的数据库中:

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提供了各种字段类型 (这里我们仅使用StringFieldIntField)以及这些类型的选项 

创建操作

当我们实现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。我们可以看到它们具有相当的可比性, 并且可以很好地协同工作。我们使用了两个模块PyMongoMongoEngine,因此根据您需要的抽象级别,可以选择最适合您的项目的一个。

在Python中使用MongoDB相关推荐

  1. MongoDB数据库(8.Python中使用mongodb数据库以及pymongo模块用法)

    在Python中使用MongoDB数据库,首先要下载pymongo模块 直接在命令行   pip install pymongo   就可以了 Python中使用pymongo模块对MongoDB数据 ...

  2. python 中使用mongodb的封装

    from pymongo import MongoClientclass MongoHelp(object):"""mongodb增删改查的操作""& ...

  3. python连接mongodb进行查询_Python中的MongoDB基本操作:连接、查询实例

    MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可护展的高性能数据存储解决方案.它的特点是高性能.易部署.易使用,存储数据非常方便. MongoDB 简单使用 联 ...

  4. python执行shell脚本、执行mongodb_Mongo shell 的基本操作和 Python shell 中使用 MongoDB...

    Mongo shell 的基本操作 MongoDB 分四级存储: 1.数据库 db 2.文档集合 collections(相当于 MySQL 的数据库表) 3.文档 document(相当于 MySQ ...

  5. mongodb python 大于_Python中使用MongoDB详解

    作者:Zarten知乎专栏:Python爬虫深入详解知乎ID: Zarten简介: 互联网一线工作者,尊重原创并欢迎评论留言指出不足之处,也希望多些关注和点赞是给作者最好的鼓励 ! 介绍 MongoD ...

  6. mongodb创建用户名和密码_Python中使用MongoDB详解

    作者:Zarten知乎专栏:Python爬虫深入详解知乎ID: Zarten简介: 互联网一线工作者,尊重原创并欢迎评论留言指出不足之处,也希望多些关注和点赞是给作者最好的鼓励 ! 介绍 MongoD ...

  7. python中文文档-Python语言、主要工具与类库中文文档

    Python是Guido van Rossum在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言. Python 提供了非常完善的基础代码库,覆盖了网络.文件.GUI.数据库.文本等大量 ...

  8. python中Mongodb的Objectid 实现

    python中Mongodb的Objectid 实现 Mongodb 作为非关系型数据库,默认实现 了Objectid 作为索引,对数据进行排序. ojbectid 组成 在 ObjectId 类中, ...

  9. spring mysql mongdb_Spring Boot中使用MongoDB数据库的方法

    MongoDB数据库简介 简介 MongoDB是一个高性能,开源,无模式的,基于分布式文件存储的文档型数据库,由C++语言编写,其名称来源取自"humongous",是一种开源的文 ...

最新文章

  1. eDRX中的Paging
  2. 第4章-无人车UGV模型分析
  3. KubeEdge vs K3S:Kubernetes在边缘计算场景的探索
  4. python 计时器 timeit repeat 计算(语句)(函数)耗时 时间 运行时长
  5. JSON 是什么?它能带来什么?它和 XML 比较?
  6. Codeforces Round #374 (Div. 2) A. One-dimensional Japanese Crosswor 水题
  7. linux上 arm开发环境搭建,详解 LINUX下QT For ARM开发环境搭建过程
  8. mysql bit php,Bit Web Server (PHP,MySQL,PMA) 安卓WEB服务器
  9. 11.python之线程,协程,进程,
  10. asp.net core 系列 10 配置configuration (上)
  11. Python实现微信自动抠图换底助手
  12. 使用ps删除多余的内容
  13. 老毛子 K2 通过SSH 抓包
  14. android wifi信号检测
  15. mysql安装步骤图解5.0_MySQL5.0安装图解
  16. python读写excel的图片_Python读取excel中的图片完美解决方法
  17. 亚马逊云服务(AWS)机器学习服务Amazon SageMaker发力中国
  18. JS 进阶 (六) 浏览器事件模型DOM操作
  19. 力扣 (LeetCode)-对称二叉树,树|刷题打卡
  20. 情态动词+have+done用法整理

热门文章

  1. linux 临时 目录权限,linux文件和目录权限的设置
  2. c++hello world代码_在Rust代码中编写Python是种怎样的体验?
  3. echo输出换行_Bash shell教程[5] echo命令
  4. java11新特性_Java11 发布前抓紧掌握这些新特性
  5. 海报样机模型帮助以专业的方式展示你的设计
  6. 高端中餐美食餐饮海报PSD模板,看着就有食欲
  7. UI设计干货模板|输入框设计临摹素材
  8. 护理在计算机的应用研究,计算机虚拟和模拟技术在护理实践教学中应用的研究...
  9. mysql 流量带宽_流量与带宽
  10. Intel处理器家族和分类