查询NoSQL数据库的8个示例

2021-04-21 09:53:26 浏览数 (1)

磐创AI分享

作者 | Soner Yıldırım 编译 | VK 来源 | Towards Data Science

NoSQL是指非SQL或非关系数据库设计。它提供了一种有组织的方式来存储数据,但不是以表格的形式(即带标签的行和列)。

NoSQL数据库用来存储数据的常见结构有键值对、图形或文档。数据科学生态系统中使用了几种NoSQL数据库。在本文中,我们将使用一个流行的MongoDB。

MongoDB将数据存储为文档。MongoDB中的文档由字段-值对组成。文档以称为集合的结构组织。打个比方,文档可以看作是表中的一行,集合可以看作是整个表。


我们将通过10个示例演示如何从MongoDB数据库检索数据。

我们有一个叫“customer”的集合。客户集合中的文档包含客户姓名、年龄、性别和上次购买的金额。

以下是客户集合中的文档:

代码语言:javascript复制
{
 
 "_id" : ObjectId("600c1806289947de938c68ea"),
 
 "name" : "John",
 
 "age" : 32,
 
 "gender" : "male",
 
 "amount" : 32
 
}
 

文档以JSON格式显示。


例1

查询属于特定客户的文档。

我们使用find方法从MongoDB数据库中查询文档。如果不使用任何参数或集合,find方法将检索所有文档。

我们希望看到John的文档 ,因此需要在find方法中指定name字段。

代码语言:javascript复制
 > db.customer.find( {name: "John"} )
 
{ "_id" : ObjectId("600c1806289947de938c68ea"), "name" : "John", "age" : 32, "gender" : "male", "amount" : 32} 

我们可以附上pretty的方法,使文件看起来更吸引人。

代码语言:javascript复制
 > db.customer.find( {name: "John"} ).pretty()
 
{
 
 "_id" : ObjectId("600c1806289947de938c68ea"),
 
 "name" : "John",
 
 "age" : 32,
 
 "gender" : "male",
 
 "amount" : 32
 
}

现在读起来容易多了。


例2

查询属于40岁以上客户的文档。

使用逻辑运算符将条件应用于年龄字段。“$gt”表示“大于”,用法如下。

代码语言:javascript复制
> db.customer.find( {age: {$gt:40}} ).pretty()
 
 
{
 
 "_id" : ObjectId("600c19d2289947de938c68ee"),
 
 "name" : "Jenny",
 
 "age" : 42,
 
 "gender" : "female",
 
 "amount" : 36
 
}

例3

查询属于25岁以下女性客户的文档。

此示例类似于前两个示例的组合。这两个条件都必须满足,所以我们使用“和”逻辑来组合这些条件。可以写两个条件,用逗号分隔。

代码语言:javascript复制
> 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”代表“小于”。


例4

在本例中,我们将以不同的方式重复前面的示例。多个条件也可以与“and”逻辑组合,如下所示。

代码语言:javascript复制
>db.customer.find( {$and :[ {gender: "female", age: {$lt:25}} ]} ).pretty()

用于组合条件的逻辑在开头指出。剩下的部分与前面的示例相同,但我们需要将条件放入一个列表([])。


例5

询问男性或25岁以下的客户。

这个例子需要一个带有“or”逻辑的复合查询。我们只需要把“and”改成“or”。

代码语言:javascript复制
> 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 
 

例6

MongoDB允许在从数据库检索时聚合值。例如,我们可以计算男性和女性的总购买量。使用aggregate方法而不是find方法。

代码语言:javascript复制
> 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函数非常相似。


例7

让我们进一步看前面的示例,并添加一个条件。因此,我们首先选择“match”条件的文档并应用聚合。

下面的查询是一个聚合管道,它首先选择25岁以上的客户,并计算男性和女性的平均购买金额。

代码语言:javascript复制
> 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 }
 

例8

上一个示例中的查询只包含两个组,因此不必对结果进行排序。但是,我们可能有返回多个值的查询。在这种情况下,对结果进行排序是一种很好的做法。

我们可以按平均金额按升序对上一次查询的结果进行排序。

代码语言:javascript复制
> 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数据库。当然,还有很多事情要做。我们可能会为一个典型的任务编写更高级的查询。但是,一旦你熟悉了基础知识,就可以轻松地转到更高级的查询。

感谢你的阅读。

0 人点赞