作者 | Soner Yıldırım 编译 | VK 来源 | Towards Data Science
NoSQL是指非SQL或非关系数据库设计。它提供了一种有组织的方式来存储数据,但不是以表格的形式(即带标签的行和列)。
NoSQL数据库用来存储数据的常见结构有键值对、图形或文档。数据科学生态系统中使用了几种NoSQL数据库。在本文中,我们将使用一个流行的MongoDB。
MongoDB将数据存储为文档。MongoDB中的文档由字段-值对组成。文档以称为集合的结构组织。打个比方,文档可以看作是表中的一行,集合可以看作是整个表。
我们将通过10个示例演示如何从MongoDB数据库检索数据。
我们有一个叫“customer”的集合。客户集合中的文档包含客户姓名、年龄、性别和上次购买的金额。
以下是客户集合中的文档:
{
"_id" : ObjectId("600c1806289947de938c68ea"),
"name" : "John",
"age" : 32,
"gender" : "male",
"amount" : 32
}
文档以JSON格式显示。
查询属于特定客户的文档。
我们使用find方法从MongoDB数据库中查询文档。如果不使用任何参数或集合,find方法将检索所有文档。
我们希望看到John的文档 ,因此需要在find方法中指定name字段。
> db.customer.find( {name: "John"} )
{ "_id" : ObjectId("600c1806289947de938c68ea"), "name" : "John", "age" : 32, "gender" : "male", "amount" : 32}
我们可以附上pretty的方法,使文件看起来更吸引人。
> db.customer.find( {name: "John"} ).pretty()
{
"_id" : ObjectId("600c1806289947de938c68ea"),
"name" : "John",
"age" : 32,
"gender" : "male",
"amount" : 32
}
现在读起来容易多了。
查询属于40岁以上客户的文档。
使用逻辑运算符将条件应用于年龄字段。“$gt”表示“大于”,用法如下。
> db.customer.find( {age: {$gt:40}} ).pretty()
{
"_id" : ObjectId("600c19d2289947de938c68ee"),
"name" : "Jenny",
"age" : 42,
"gender" : "female",
"amount" : 36
}
查询属于25岁以下女性客户的文档。
此示例类似于前两个示例的组合。这两个条件都必须满足,所以我们使用“和”逻辑来组合这些条件。可以写两个条件,用逗号分隔。
> db.customer.find( {gender: "female", age: {$lt:25}} ).pretty()
{
"_id" : ObjectId("600c19d2289947de938c68f0"),
"name" : "Samantha",
"age" : 21,
"gender" : "female",
"amount" : 41
}
{
"_id" : ObjectId("600c19d2289947de938c68f1"),
"name" : "Laura",
"age" : 24,
"gender" : "female",
"amount" : 51
}
“$lt”代表“小于”。
在本例中,我们将以不同的方式重复前面的示例。多个条件也可以与“and”逻辑组合,如下所示。
>db.customer.find( {$and :[ {gender: "female", age: {$lt:25}} ]} ).pretty()
用于组合条件的逻辑在开头指出。剩下的部分与前面的示例相同,但我们需要将条件放入一个列表([])。
询问男性或25岁以下的客户。
这个例子需要一个带有“or”逻辑的复合查询。我们只需要把“\and”改成“\or”。
> db.customer.find( {
{ "_id" : ObjectId("600c1806289947de938c68ea"), "name" : "John", "age" : 32, "gender" : "male", "amount" : 32 }
{ "_id" : ObjectId("600c19d2289947de938c68ed"), "name" : "Martin", "age" : 28, "gender" : "male", "amount" : 49 }
{ "_id" : ObjectId("600c19d2289947de938c68ef"), "name" : "Mike", "age" : 29, "gender" : "male", "amount" : 22 }
{ "_id" : ObjectId("600c19d2289947de938c68f0"), "name" : "Samantha", "age" : 21, "gender" : "female", "amount" : 41
MongoDB允许在从数据库检索时聚合值。例如,我们可以计算男性和女性的总购买量。使用aggregate方法而不是find方法。
> db.customer.aggregate([
... {
Extra open brace or missing close brace
s
u
m
:"
... ])
{ "_id" : "female", "total" : 198 }
{ "_id" : "male", "total" : 103 }
让我们详细说明一下语法。我们首先通过选择“\$gender”作为id按gender列对文档进行分组。下一部分指定聚合函数(在我们的示例中是“$sum”)和要聚合的列。
如果你熟悉Pandas,那么语法与groupby函数非常相似。
让我们进一步看前面的示例,并添加一个条件。因此,我们首先选择“match”条件的文档并应用聚合。
下面的查询是一个聚合管道,它首先选择25岁以上的客户,并计算男性和女性的平均购买金额。
> db.customer.aggregate([
... {
Extra open brace or missing close brace
gt:25} } },
... {
Extra open brace or missing close brace
a
v
g
:"
... ])
{ "_id" : "female", "avg" : 35.33 }
{ "_id" : "male", "avg" : 34.33 }
上一个示例中的查询只包含两个组,因此不必对结果进行排序。但是,我们可能有返回多个值的查询。在这种情况下,对结果进行排序是一种很好的做法。
我们可以按平均金额按升序对上一次查询的结果进行排序。
> db.customer.aggregate([
... {
Extra open brace or missing close brace
gt:25} } },
... {
Extra open brace or missing close brace
a
v
g
:"
... { $sort: {avg: 1} }
... ])
{ "_id" : "male", "avg" : 34.33 }
{ "_id" : "female", "avg" : 35.33 }
我们刚刚在聚合管道中添加了“$sort”。用于排序的字段与排序行为一起指定。1表示升序,-1表示降序。
SQL和NoSQL在数据科学生态系统中都是至关重要的。数据科学的燃料是数据,所以一切都从正确的、维护良好的和容易访问的数据开始。SQL和NoSQL都是这些过程的关键参与者。
我们简要介绍了如何查询MongoDB数据库。当然,还有很多事情要做。我们可能会为一个典型的任务编写更高级的查询。但是,一旦你熟悉了基础知识,就可以轻松地转到更高级的查询。
感谢你的阅读。