65.9K
CodeProject 正在变化。 阅读更多。
Home

开始使用 Python 和 MongoDB

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2018年4月30日

CPOL
viewsIcon

20882

在本文中,您将学习如何执行以下操作:使用 MongoDB Atlas 创建免费托管的 MongoDB 数据库、安装 PyMongo(Python 驱动程序)、连接到 MongoDB、探索 MongoDB 集合和文档、使用 PyMongo 执行基本的创建、检索、更新和删除 (CRUD) 操作。

免费试用 MongoDB Atlas

您可以通过利用其驱动程序之一,开始使用 MongoDB 和您喜欢的编程语言。其中许多驱动程序由 MongoDB 工程师维护,其他则由社区成员维护。MongoDB 拥有原生的 Python 驱动程序 PyMongo,以及一个专门致力于使驱动程序满足 Python 社区需求的驱动程序工程师团队。

本文面向刚接触 MongoDB 的 Python 开发人员,您将在此了解以下内容:

  • 使用 MongoDB Atlas 创建免费托管的 MongoDB 数据库
  • 安装 PyMongo,Python 驱动程序
  • 连接到 MongoDB
  • 探索 MongoDB 集合和文档
  • 使用 PyMongo 执行基本的创建、检索、更新和删除 (CRUD) 操作

让我们开始吧!

您可以通过 MongoDB Atlas 上的免费 MongoDB 集群立即开始使用 MongoDB。MongoDB Atlas 是一项托管的数据库服务,允许您选择数据库大小并获取连接字符串!如果您有兴趣使用免费套餐,请遵循本文末尾附录中的说明。

安装 Python 驱动程序

在本文中,我们将安装名为“PyMongo”的 Python 驱动程序。

尽管社区编写了其他驱动程序,但 PyMongo 是 MongoDB 的官方 Python 驱动程序。有关驱动程序的详细文档,请在此处查看文档

安装驱动程序的最简单方法是通过 pip 包管理系统。在命令行中执行以下命令:

python -m pip install pymongo

注意:如果您使用的是 Atlas M0(免费套餐)集群,则必须使用 Python 2.7.9+ 和 Python 3.4 或更高版本。您可以通过执行 “python --version”“pip list” 命令分别检查您安装的 Python 和 PyMongo 的版本。

有关驱动程序安装的各种选项,请查看完整文档

安装 PyMongo 后,我们就可以编写第一个应用程序来返回有关 MongoDB 服务器的信息。在您的 Python 开发环境或文本编辑器中,输入以下代码。

from pymongo import MongoClient
# pprint library is used to make the output look more pretty
from pprint import pprint
# connect to MongoDB, change the << MONGODB URL >> to reflect your own connection string
client = MongoClient(<<MONGODB URL>>)
db=client.admin
# Issue the serverStatus command and print the results
serverStatusResult=db.command("serverStatus")
pprint(serverStatusResult)

将“<<MONGODB URL>>”替换为您的 MongoDB 连接字符串。将此文件另存为“mongodbtest.py”,并通过命令行“python mongodbtest.py”运行它。

示例如输出如下:

{u'asserts': {u'msg': 0,
              u'regular': 0,
              u'rollovers': 0,
              u'user': 0,
              u'warning': 0},
 u'connections': {u'available': 96, u'current': 4, u'totalCreated': 174L},
 u'extra_info': {u'note': u'fields vary by platform', u'page_faults': 0},
 u'host': u'cluster0-shard-00-00-6czvq.mongodb.net:27017',
 u'localTime': datetime.datetime(2017, 4, 4, 0, 18, 45, 616000),
.
.
.
}

请注意,‘u’ 字符来自 Python 输出,表示字符串以 unicode 形式存储。此示例还使用了 pprint 库,该库与 MongoDB 无关,在此仅用于使输出在控制台中结构化且视觉上具有吸引力。

在此示例中,我们连接到 MongoDB 实例并发出“db.serverStatus()”命令(参考)。此命令返回有关我们 MongoDB 实例的信息,并在此示例中用作针对 MongoDB 执行命令的一种方式。

如果您的应用程序成功运行,您就可以继续了!

探索集合和文档

MongoDB 以文档形式存储数据。文档不像 Microsoft Word 或 Adobe PDF 文档,而是基于JSON 规范的 JSON 文档。
JSON 文档示例如下:

图 1:示例文档

请注意,文档不仅是键/值对,还可以包含数组和子文档。数据本身可以是不同的数据类型,例如地理空间、十进制和 ISODate 等。在内部,MongoDB 存储 JSON 的二进制表示形式,称为 BSON。这使得 MongoDB 能够提供 JSON 规范中未定义的十进制等数据类型。有关 BSON 规范的更多信息,请查看以下 URL:http://bsonspec.org

MongoDB 中的集合是文档的容器。数据库是集合的容器。这种分组类似于关系数据库,下图进行了说明:

 

关系概念 MongoDB 对应
数据库 数据库
表格 集合
Rows Documents
目录 目录

 

以文档形式存储数据有很多优点。尽管更深入的讨论超出了本文的范围,但从我们简单的 Python 脚本中可以看出一些优点,例如动态、灵活的模式以及存储数组的能力。有关 MongoDB 文档结构的更多信息,请查看以下 URL 的在线文档:https://docs.mongodb.com/manual/core/document/

让我们看看如何使用 PyMongo 在 MongoDB 文档上执行基本的 CRUD 操作。

使用 PyMongo 执行基本的 CRUD 操作

要使用 PyMongo 建立与 MongoDB 的连接,请使用 MongoClient 类。

from pymongo import MongoClient
client = MongoClient('<<MongoDB URL>>’)

“<<MongoDB URL>>”是 MongoDB 连接字符串的占位符。有关如何创建 MongoDB 连接字符串的详细信息,请参阅连接字符串文档。如果您正在使用 Atlas 作为 MongoDB 数据库,请参阅“测试您的连接”部分,了解有关获取 MongoDB Atlas 连接字符串的更多信息。

我们现在可以创建一个数据库对象,如下所示引用名为 “business” 的新数据库:

db = client.business

创建此对象后,我们就可以执行 CRUD 操作。由于我们想要一些有用的东西来进行查询,让我们先构建一个示例数据生成器应用程序。

生成示例数据代码示例

使用开发工具或命令行文本编辑器创建一个名为 createsamples.py 的新文件,并复制以下代码:

from pymongo import MongoClient
from random import randint
#Step 1: Connect to MongoDB - Note: Change connection string as needed
client = MongoClient(port=27017)
db=client.business
#Step 2: Create sample data
names = ['Kitchen','Animal','State', 'Tastey', 'Big','City','Fish', 'Pizza','Goat', 'Salty','Sandwich','Lazy', 'Fun']
company_type = ['LLC','Inc','Company','Corporation']
company_cuisine = ['Pizza', 'Bar Food', 'Fast Food', 'Italian', 'Mexican', 'American', 'Sushi Bar', 'Vegetarian']
for x in xrange(1, 501):
    business = {
        'name' : names[randint(0, (len(names)-1))] + ' ' + names[randint(0, (len(names)-1))]  + ' ' + company_type[randint(0, (len(company_type)-1))],
        'rating' : randint(1, 5),
        'cuisine' : company_cuisine[randint(0, (len(company_cuisine)-1))] 
    }
    #Step 3: Insert business object directly into MongoDB via isnert_one
    result=db.reviews.insert_one(business)
    #Step 4: Print to the console the ObjectID of the new document
    print('Created {0} of 100 as {1}'.format(x,result.inserted_id))
#Step 5: Tell us that you are done
print('finished creating 100 business reviews')

务必将 MongoDB 客户端连接 URL 更改为指向您的 MongoDB 数据库实例的 URL。运行此应用程序后,将在名为“business”的 MongoDB 数据库中创建 500 个随机命名的企业及其相应的评分。所有这些企业都创建在名为“reviews”的单个集合中。请注意,我们不必预先显式创建数据库即可使用它。这与其他需要先执行“CREATE DATABASE”等语句的数据库不同。

此示例中将数据插入 MongoDB 的命令是 insert_one() 函数。insert_one 函数的含义不言而喻,它会将一个文档插入 MongoDB。结果集将返回创建的单个 ObjectID。这是插入数据的方法之一。如果您想一次插入多个文档,可以使用 insert_many 函数。除了插入的确认之外,insert_many 的结果集还将包含创建的 ObjectIDs 列表。有关 insert_many 的更多信息,请在此处查看文档

有关 insert_many 结果集的详细信息,请同时查看此部分文档

现在我们可以使用 Python 探索 MongoDB 中的查询和管理数据了。为了指导这项探索,我们将创建另一个应用程序来管理我们的企业评论。

探索企业评论数据

现在我们的数据库中已经有了大量数据,让我们使用 PyMongo 查询一些结果。

在 MongoDB 中,find_one 命令用于查询单个文档,类似于关系数据库中的 select 语句。要在 PyMongo 中使用 find_one 命令,我们传递一个指定搜索条件的 Python 字典。例如,让我们通过传递字典 “{ ‘rating’ : 5 } “ 来查找单个评分为 5 的企业。

fivestar = db.reviews.find_one({'rating': 5})
print(fivestar)

The result will contain data similar to the following:

{u'rating': 5,
 u'_id': ObjectId('58e65383ea0b650c867ef195'),
 u'name': u'Fish Salty Corporation', 
u'cuisine': u'Sushi Bar'}

考虑到我们创建了 500 个示例数据,评分 5 的企业不止一家。find_one 方法是支持查询 MongoDB 数据的一系列 find 语句之一。另一个名为“find”的语句将返回一个匹配搜索条件的文档游标。这些游标还支持 count() 等方法,用于返回查询结果的数量。要查找评分为 5 的企业的总数,我们可以使用 count() 方法,如下所示:

fivestarcount = db.reviews.find({'rating': 5}).count()
print(fivestarcount)

您的结果可能会有所不同,因为数据是随机生成的,但在一次测试运行中,返回了 103 的值。

MongoDB 可以轻松地执行这些简单的查询。但是,请考虑您想对整个数据集中的每个评分的出现次数进行求和的场景。在 MongoDB 中,您可以创建 5 个单独的 find 查询,执行它们并呈现结果,或者您可以简单地使用 MongoDB 聚合管道发出单个查询,如下所示:

from pymongo import MongoClient
# Connect to the MongoDB, change the connection string per your MongoDB environment
client = MongoClient(port=27017)
# Set the db object to point to the business database
db=client.business
# Showcasing the count() method of find, count the total number of 5 ratings 
print('The number of 5 star reviews:')
fivestarcount = db.reviews.find({'rating': 5}).count()
print(fivestarcount)
# Not let's use the aggregation framework to sum the occurrence of each rating across the entire data set
print('\nThe sum of each rating occurance across all data grouped by rating ')
stargroup=db.reviews.aggregate(
# The Aggregation Pipeline is defined as an array of different operations
[
# The first stage in this pipe is to group data
{ '$group':
    { '_id': "$rating",
     "count" : 
                 { '$sum' :1 }
    }
},
# The second stage in this pipe is to sort the data
{"$sort":  { "_id":1}
}
# Close the array with the ] tag             
] )
# Print the result
for group in stargroup:
    print(group)

深入研究聚合框架超出了本文的范围,但是,如果您有兴趣了解更多信息,请查看以下 URL:https://docs.mongodb.com/manual/aggregation/

使用 PyMongo 更新数据

insert_oneinsert_many 类似,存在帮助您更新 MongoDB 数据的函数,包括 update_oneupdate_manyreplace_oneupdate_one 方法将根据匹配文档的查询更新单个文档。例如,假设我们的企业评论应用程序现在具有用户“点赞”企业的功能。为了说明更新具有此新“likes”字段的文档,让我们首先看看我们先前应用程序插入 MongoDB 的现有文档的样子。接下来,让我们更新文档并重新查询该文档,看看更改。

from pymongo import MongoClient
#include pprint for readabillity of the 
from pprint import pprint

#change the MongoClient connection string to your MongoDB database instance
client = MongoClient(port=27020)
db=client.business

ASingleReview = db.reviews.find_one({})
print('A sample document:')
pprint(ASingleReview)

result = db.reviews.update_one({'_id' : ASingleReview.get('_id') }, {'$inc': {'likes': 1}})
print('Number of documents modified : ' + str(result.modified_count))

UpdatedDocument = db.reviews.find_one({'_id':ASingleReview.get('_id')})
print('The updated document:')
pprint(UpdatedDocument)

运行上述示例代码时,您可能会看到类似以下的结果:

A sample document:
{'_id': ObjectId('58eba417ea0b6523b0fded4f'),
 'cuisine': 'Pizza',
 'name': 'Kitchen Goat Corporation',
 'rating': 1}

Number of documents modified : 1

The updated document:
{'_id': ObjectId('58eba417ea0b6523b0fded4f'),
 'cuisine': 'Pizza',
 'likes': 1,
 'name': 'Kitchen Goat Corporation',
 'rating': 1}

请注意,原始文档没有“likes”字段,而更新使我们能够轻松地将该字段添加到文档中。这种无需繁琐的 Alter_Table 语句即可动态添加键的能力是 MongoDB 灵活数据模型的强大之处。它使快速应用程序开发成为现实。

如果您想更新文档的所有字段并保留相同的 ObjectID,您应该使用 replace_one 函数。有关 replace_one 的更多详细信息,请在此处查看pymongo 文档

更新函数还支持一个名为“upsert”的选项。使用 upsert,您可以指示 MongoDB 在要更新的文档不存在时创建一个新文档。

删除文档

与之前讨论的其他命令一样,delete_one 和 delete_many 命令将匹配要删除文档的查询作为第一个参数。例如,如果要删除 reviews 集合中 category 为“Bar Food”的所有文档,请执行以下操作:

result = db.restaurants.delete_many({“category”: “Bar Food“})

如果您删除大量文档,则删除整个集合可能比删除所有文档更有效。

下一步

学习 MongoDB 和 Python 有很多选择。MongoDB University 是一个不错的起点,可以学习有关管理、开发以及 MongoDB 分析等主题的知识。其中一个特别的课程是 MongoDB for Developers (Python)。本课程将更深入地涵盖本文的主题,包括对 MongoDB 聚合框架的讨论。有关更多信息,请访问以下 URL:https://university.mongodb.com/courses/M101P/about

附录:创建免费套餐 MongoDB Atlas 数据库

MongoDB Atlas 是一项托管的数据库服务,允许您选择数据库大小并获取连接字符串!按照以下步骤开始使用您的免费

免费构建您的集群

按照以下步骤创建免费 MongoDB 数据库:

  1. 访问以下 URL:https://mongodb.ac.cn/cloud/atlas
  2. 单击“Start Free”按钮。
  3. 填写表单以创建帐户。您将使用这些信息稍后登录和管理您的 MongoDB。

填写表单后,网站将创建您的帐户,您将看到“Build Your New Cluster”弹出窗口,如图 1 所示。

要使用免费套餐,请向下滚动并选择“M0”。执行此操作时,区域面板将禁用。免费套餐有一些限制,其中选择区域是其中之一,您的数据库大小将限制为 512MB 存储。考虑到这一点,当您准备好将 MongoDB 用于不仅仅是一些简单的操作时,您可以通过从“Instance Size”列表中选择大小来轻松创建另一个实例。在单击“Confirm & Deploy”之前,向下滚动页面,并注意图 2 中显示的附加选项。

从“Build Your New Cluster”弹出窗口中,您可以看到还有其他可用选项,包括选择 3、5 或 7 节点副本集以及最多 12 片群集。请注意,免费套餐不允许您选择除 3 节点群集以外的任何内容,但如果您选择其他大小,则这些选项将可用。此时我们已基本准备就绪;最后要解决的是管理员用户名和密码。您也可以选择通过单击“Autogenerate Secure Password”按钮来生成随机密码。最后,单击“Confirm & Deploy”按钮以创建您的 Atlas 集群。设置 IP 白名单

在 Atlas 创建数据库时,您需要定义允许访问新数据库的 IP 地址,因为 MongoDB Atlas 默认不允许从 Internet 访问。此允许的 IP 地址列表称为“IP 白名单”。要将您计算机的 IP 添加到此列表中,请单击“Security”选项卡,然后单击“IP Whitelist”,然后单击“+ ADD IP ADDRESS”按钮。这将弹出另一个对话框,如下面的图 3 所示。您可以单击“Add current IP Address”按钮来添加您的 IP,或者提供一个特定的 IP 地址,或者通过完全不限制 IP 来启用对世界的访问(这不是一个绝妙的主意,但以防万一您别无选择,需要允许任何 IP 进行身份验证)。

填写此对话框后,单击“Confirm”,这将更新 MongoDB Atlas 集群上的防火墙设置。接下来,单击“Clusters”选项卡,您应该会看到新的 MongoDB 数据库已准备就绪!

测试您的连接

在开始编写代码之前,我们要确保 MongoDB 数据库可以从我们的开发计算机访问。一种快速测试方法是使用 Mongo Shell 命令行工具进行连接。请确保您拥有 MongoDB 连接信息。如果您使用的是 MongoDB Atlas,则可以通过单击“Clusters”选项卡上的“Connect”按钮来获取连接信息,如图 5 所示。

“Connect”按钮将打开一个提供连接信息的对话框。在此对话框的底部,您将看到一个准备好的命令行,您可以直接复制并粘贴到命令提示符中。

请注意,如果您按原样复制连接文本,则必须将 <password> 替换为 admin 用户的密码,将 <database> 替换为您希望连接到的数据库的名称。

从该对话框生成的命令文本很长。为了清晰起见,让我们分别看一下每个参数。

mongo
"mongodb://cluster0-shard-00-00-2ldwo.mongodb.net:27017,cluster0-shard-00-01-2ldwo.mongodb.net:27017,cluster0-shard-00-02-2ldwo.mongodb.net:27017/test?replicaSet=Cluster0-shard-0"
 --authenticationDatabase admin 
--ssl
--username myadmin 
--password S$meComPLeX1!

第一个参数是一个字符串,包含我们集群中所有节点(包括名为 “Cluster0-shard-0” 的副本集定义)的列表。下一个参数 “--authenticationDatabase” 告诉我们哪个数据库包含我们要进行身份验证的用户。“--ssl” 强制通过 SSL/TLS 协议加密连接。最后,我们提供用户名和密码,这样我们就连接成功了!请注意,如果您不使用 MongoDB Atlas,您的 MongoDB 部署可能没有启用安全功能或不需要 SSL。因此,连接到它可能就像在命令提示符中键入“mongo”一样简单。

您现在已准备好使用 MongoDB!

如果您有兴趣了解开始构建基于 MongoDB 的应用程序所需的一切,您可以注册我们提供的免费在线MongoDB University 课程之一。

© . All rights reserved.