作者 |LAKSHAY ARORA
编译 |Flin
起源 |analyticsvidhya
介绍
随着互联网的遍及,咱们当初正以前所未有的速度生成数据。因为执行任何类型的剖析都须要咱们从数据库中收集 / 查问必要的数据,所以抉择正确的工具来查问数据变得至关重要。因而,咱们无奈设想应用 SQL 来解决如此大量的数据,因为每个查问的老本都很高。
这正是 MongoDB 的用武之地。MongoDB 是一个非结构化数据库,以文档模式存储数据。此外,MongoDB 可能十分高效地解决大量数据,并且是应用最宽泛的 NoSQL 数据库,因为它提供了丰盛的查询语言以及对数据的灵便而疾速的拜访。
在本文中,咱们将看到无关如何应用 PyMongo 查问 MongoDB 数据库的多个示例。此外,咱们将看到如何应用比拟运算符和逻辑运算符,正则表达式以及聚合管道的基础知识。
本文是 MongoDB 初学者教程(https://www.analyticsvidhya.c…)的连续,其中咱们探讨了非结构化数据库,装置步骤和 MongoDB 基本操作的挑战。因而,如果你是 MongoDB 的初学者,我倡议你先浏览该文章。
目录
- 什么是 PyMongo?
- 装置步骤
- 将数据插入数据库
-
查询数据库
- 依据字段过滤
- 依据比拟运算符进行过滤
- 基于逻辑运算符的过滤
- 罕用表白
- 聚合管道
- 尾注
什么是 PyMongo?
PyMongo 是一个 Python 库,使咱们可能与 MongoDB 连贯。此外,这是 MongoDB 和 Python 一起应用的最举荐的办法。
另外,咱们抉择 Python 与 MongoDB 进行交互,因为它是数据迷信中最罕用且性能最弱小的语言之一。PyMongo 容许咱们应用相似于字典的语法来检索数据。
如果你是 Python 的初学者,我倡议你加入此收费课程:Python 入门。
- https://courses.analyticsvidh…
装置步骤
装置 PyMongo 十分简单明了。在这里,我假如你曾经装置了 Python 3 和 MongoDB。以下命令将帮忙你装置 PyMongo:
pip3 install pymongo
将数据插入数据库
当初让咱们进行设置,而后再应用 PyMongo 查问 MongoDB 数据库。首先,咱们将数据插入数据库。以下步骤将为你提供帮忙
- 导入库并连贯到 mongo 客户端
在计算机上启动 MongoDB 服务器。我假如它正在 localhost:27017 运行文件。
让咱们开始导入一些咱们将要应用的库。默认状况下,MongoDB 服务器在本地计算机上的端口 27017 上运行。而后,咱们将应用 pymongo 库连贯到 MongoDB 客户端。
而后获取数据库 sample_db 的数据库实例。万一它不存在,MongoDB 将为你创立一个。
# 导入所需的库
import pymongo
import pprint
import json
import warnings
warnings.filterwarnings('ignore')
# 连贯到 mongoclient
client = pymongo.MongoClient('mongodb://localhost:27017')
# 获取数据库
database = client['sample_db']
- 从 JSON 文件创建汇合
咱们将应用在多个城市经营的一家送餐公司的数据。此外,他们在这些城市设有各种配送核心,用于向其顾客发送餐单。你能够在此处下载数据和代码。
- https://drive.google.com/driv…
-
weekly_demand:
- id:每个文档的惟一 ID
- week:周号
- center_id:配送核心的惟一 ID
- meal_id:餐的惟一 ID
- checkout_price:最终价格,包含折扣,税金和送货费
- base_price:餐的根本价格
- emailer_for_promotion:发送电子邮件以促成进餐
- homepage_featured:首页提供的餐点
- num_orders:(指标)订单数
-
meal_info:
- meal_id:餐的惟一 ID
- category:餐食类型(饮料 / 小吃 / 汤……)
- cuisine:美食(印度 / 意大利 /…)
而后,咱们将在 sample_db 数据库中创立两个汇合:
# 创立每周需要收集
database.create_collection("weekly_demand")
# 创立餐食信息
database.create_collection("meal_info")
- 将数据插入汇合
当初,咱们领有的数据为 JSON 格局。而后,咱们将取得汇合的实例,读取数据文件,并应用 insert_many 函数插入数据。
# 获取 collection weekly_demand
weekly_demand_collection = database.get_collection("weekly_demand")
# 关上 weekly_demand json 文件
with open("weekly_demand.json") as f:
file_data = json.load(f)
# 将数据插入汇合
weekly_demand_collection.insert_many(file_data)
# 获取总数据点数
weekly_demand_collection.find().count()
# >> 456548
# 获取珍藏餐
meal_info_collection = database.get_collection("meal_info")
# 关上 meat_info json 文件
with open("meal_info.json") as f:
file_data = json.load(f)
# 将数据插入汇合
meal_info_collection.insert_many(file_data)
# 获取总数据点数
meal_info_collection.find().count()
# >> 51
最初,在 weekly_demand_collection 中有 456548 个文档,在餐信息汇合中有 51 个文档。当初,让咱们看一下每个汇合中的一个文档。
weekly_demand_collection
weekly_demand_collection.find_one()
膳食信息集
meal_info_collection.find_one()
当初,咱们的数据已准备就绪。让咱们持续查问该数据库。
查询数据库
咱们能够应用带有查找性能的 PyMonfo 查问 MongoDB 数据库,以获取满足给定条件的所有后果,还能够应用 find_one 函数,该函数将仅返回满足条件的一个后果。
以下是 find 和 find_one 的语法:
your_collection.find({<< query >>} , {<< fields>>} )
你能够应用以下过滤技术查询数据库
- 依据字段过滤
例如,你有数百个字段,而你只想看到其中的几个。你能够通过将所有必填字段名称都设置为值 1 来实现此目标。例如,
weekly_demand_collection.find_one({}, {"week": 1, "checkout_price" : 1})
另一方面,如果只想从整个文档中抛弃一些字段,则能够将字段名称设置为等于 0。因而,将仅排除那些字段。请留神,你不能应用 1 和 0 的组合来获取字段。要么全副为一,要么全副为零。
weekly_demand_collection.find_one({}, {"num_orders" : 0, "meal_id" : 0})
- 过滤条件
当初,在本节中,咱们将在第一个大括号中提供一个条件,并在第二个中删除该字段。因而,它将返回 center_id 等于 55 且 meal_id 等于 1885 的第一个文档,并且还将抛弃字段_id 和 week。
weekly_demand_collection.find_one({"center_id" : 55, "meal_id" : 1885}, {"_id" : 0, "week" : 0} )
- 依据比拟运算符进行过滤
以下是 MongoDB 中的 9 个比拟运算符。
名称 | 形容 |
$eq | 它将匹配等于指定值的值。 |
$gt | 它将匹配大于指定值的值。 |
$gte | 它将匹配所有大于或等于指定值的值 |
$in | 它将匹配数组中指定的任何值 |
$lt | 它将匹配所有小于指定值的值 |
$lte | 它将匹配所有小于或等于指定值的值 |
$ne | 它将匹配所有不等于指定值的值 |
$nin | 它将不匹配数组中指定的任何值 |
以下是应用这些比拟运算符的一些示例
- 等于和不等于
咱们将找到 center_id 等于 55 且 homepage_featured 不等于 0 的所有文档。因为咱们将应用 find 函数,因而它将返回该命令的游标。此外,应用 for 循环遍历查问后果。
result_1 = weekly_demand_collection.find({"center_id" : { "$eq" : 55},
"homepage_featured" : {"$ne" : 0}
})
for i in result_1:
print(i)
- 在列表中和不在列表中
例如,你须要将一个元素与多个元素匹配。在这种状况下,咱们能够应用 $ in 运算符,而不是屡次应用 $eq 运算符。咱们将尝试找出 center_id 为 24 或 11 的所有文档。
result_2 = weekly_demand_collection.find({"center_id" : { "$in" : [ 24, 11] }
})
for i in result_2:
print(i)
而后,咱们找到所有在指定列表中不存在 center_id 的文档。以下查问将返回 center_id 不是 24 也不是 11 的所有文档。
result_3 = weekly_demand_collection.find({"center_id" : { "$nin" : [ 24, 11] }
})
for i in result_3:
print(i)
- 小于和大于
当初,让咱们查找 center_id 为 55 并且 checkout_price 大于 100 且小于 200 的所有文档。为此,请应用以下语法
result_4 = weekly_demand_collection.find({
"center_id" : 55,
"checkout_price" : {"$lt" : 200, "$gt" : 100}
})
for i in result_4:
print(i)
- 基于逻辑运算符的过滤器
名称 | 形容 |
$and | 它将查问语句与逻辑连接起来,AND 返回同时合乎这两个条件的所有文档。 |
$not | 它将反转查问的后果,并返回与查问表达式不匹配的文档。 |
$nor | 它将应用逻辑将查问子句连接起来,NOR 返回所有与子句不匹配的文档。 |
$or | 它将应用逻辑将查问子句连接起来,OR 返回匹配任一子句条件的所有文档。 |
以下示例阐明了逻辑运算符的用法 -
- AND 运算符
上面的查问将返回 center_id 等于 11,餐号不等于 1778 的文档。AND 运算符的子查问将呈现在列表中。
result_5 = weekly_demand_collection.find({
"$and" : [{"center_id" : { "$eq" : 11}
},
{"meal_id" : { "$ne" : 1778}
}]
})
for i in result_5:
print(i)
- 或运算符
以下查问将返回 center_id 等于 11 或餐 ID 为 1207 或 2707 的所有文档。此外,or 运算符的子查问将位于列表内。
result_6 = weekly_demand_collection.find({
"$or" : [{"center_id" : { "$eq" : 11}
},
{"meal_id" : { "$in" : [1207, 2707]}
}]
})
for i in result_6:
print(i)
- 用正则表达式过滤
当你有文本字段并且要搜寻具备特定模式的文档时,正则表达式十分有用。如果你想理解无关正则表达式的更多信息,我强烈建议你浏览本文:Python 正则表达式初学者教程。
- https://www.analyticsvidhya.c…
它能够与运算符 $regex 一起应用,并且咱们能够为运算符提供值,使 regex 模式变为 matc。咱们将在该查问中应用餐信息集,而后找到在美食字段中以 C 结尾的文档。
result_7 = meal_info_collection.find({"cuisine" : { "$regex" : "^C"}
})
for i in result_7:
print(i)
让咱们再来看一个正则表达式的例子。咱们将查找所有类别以“S”结尾且以“ian”结尾的所有文档。
result_8 = meal_info_collection.find({
"$and" : [
{
"category" : {"$regex" : "^S"}},
{
"cuisine" : {"$regex" : "ian$"}}
]
})
for i in result_8:
print(i)
- 聚合管道
MongoDB 的聚合管道提供了一个框架,能够对数据集执行一系列数据转换。以下是其语法:
your_collection.aggregate([ { <stage1>}, {<stage2>},.. ] )
第一个阶段将残缺的文档集作为输出,而后每个随后的阶段都将上一个转换的后果集作为下一个阶段的输出并产生输入。
MongoDB 汇总中大概有 10 种转换可用,在本文中咱们将看到 $ match 和 $ group。咱们将在行将发表的 MongoDB 文章中具体探讨每个转换。
例如,在第一阶段,咱们将匹配 center_id 等于 11 的文档,在下一阶段,它将对 center_id 等于 11 的文档数量进行计数。请留神,咱们曾经为 $count 运算符调配了一个值,该值等于第二阶段中的 total_rows,这是咱们心愿在输入中显示的字段的名称。
result_9 = weekly_demand_collection.aggregate([
## stage 1
{
"$match" :
{"center_id" : {"$eq" : 11} }
},
## stage 2
{"$count" : "total_rows"}
])
for i in result_9:
print(i)
当初,让咱们再举一个例子,第一个阶段与之前雷同,即 center_id 等于 11,在第二个阶段中,咱们要计算 center_id 11 的字段 num_orders 的平均值和 center_id 11 的惟一 meal_ids。
result_10 = weekly_demand_collection.aggregate([
## stage 1
{
"$match" :
{"center_id" : {"$eq" : 11} }
},
## stage 2
{
"$group" : { "_id" : 0 ,
"average_num_orders": {"$avg" : "$num_orders"},
"unique_meal_id" : {"$addToSet" : "$meal_id"}}
}
])
for i in result_10:
print(i)
尾注
现在, 数据量之大令人难以置信,因而有必要找到更好的代替办法来查问数据。总而言之,在本文中,咱们学习了如何应用 PyMongo 查问 MongoDB 数据库。此外,咱们理解了如何依据所需状况利用各种过滤器。
如果你想理解无关查问数据的更多信息,我倡议你学习以下课程 —— 数据迷信的结构化查询语言(SQL)
- https://courses.analyticsvidh…
在接下来的文章中,咱们将具体探讨聚合管道。
感激浏览!
原文链接:https://www.analyticsvidhya.c…
欢送关注磐创 AI 博客站:
http://panchuang.net/
sklearn 机器学习中文官网文档:
http://sklearn123.com/
欢送关注磐创博客资源汇总站:
http://docs.panchuang.net/