使用 MongoDB 按多个字段对值进行分组
MongoDB 按多个字段分组用于使用各种方法按多个字段对值进行分组。
对 MongoDB 文档中存在的各种字段进行分组的最有效方法之一是使用 $group
运算符,它有助于在分组数据上执行多个其他聚合函数。
本文将讨论在 MongoDB 中使用运算符按文档内的多个字段对值进行分组的多种方法。它还将查看与聚合一起使用的运算符列表,以及如何借助示例来实现它们。
MongoDB 中的 $group
运算符
MongoDB 的 $group
运算符对几个聚合字段的输入和输出只不过是数据库的书面记录。它接受单个文档并返回一个或多个文档。
在对各个字段进行分组时,你可以使用各种运算符,如下所述。
聚合管道
当 POSIX
模式设置为 true
时,在 MongoDB 中对字段进行分组的另一种方法是使用管道。使用聚合物管功能,你可以过滤出符合聚合管道标准的文档。
为聚合管道的每个级别定义阶段运算符。阶段运算符可以在内部使用表达式运算符在每个级别阶段之前进行换行,甚至可以计算平均值或求和或连接特定值。
聚合管道的输出被视为最终要返回的输出,如果需要,它甚至可以存储在集合中。
处理流程
对多个字段进行分组的另一种方法是使用处理流。你可以使用 Db.collection.aggregate()
函数使用各种通道同时处理数据。
Db.collection.aggregate()
函数在内部进行聚合并为要使用的多个操作提供支持。
Db.collection.aggregate()
函数可以有效地用于一系列切片,而不会导致数据丢失。函数 Db.collection.aggregate()
返回存储在内存中的数据作为游标,可以直接用作 MongoShell
。
MongoDB 中的 $group
运算符示例
你可以在本文中使用以下集合。
db={
"invoice": [
{
"_id": 1,
"item": "apple",
"qty": 20,
"rate": 10,
"inv_date": "02/02/2020"
},
{
"_id": 2,
"item": "orange",
"qty": 15,
"rate": 8,
"inv_date": "05/12/2020"
},
{
"_id": 3,
"item": "mango",
"qty": 25,
"rate": 8,
"inv_date": "07/02/2020"
},
{
"_id": 4,
"item": "apple",
"qty": 20,
"rate": 10,
"inv_date": "02/02/2020"
},
{
"_id": 5,
"item": "mango",
"qty": 10,
"rate": 8,
"inv_date": "05/12/2020"
},
{
"_id": 6,
"item": "apple",
"qty": 30,
"rate": 10,
"inv_date": "13/04/2020"
},
{
"_id": 7,
"item": "orange",
"qty": 15,
"rate": 8,
"inv_date": "05/12/2020"
},
{
"_id": null,
"item": "banana",
"qty": 10,
"rate": 20,
"inv_date": "17/12/2020"
},
]
}
以下示例按发票日期字段分组,并显示同一日期的总成本、平均数量和发票数量。
db.invoice.aggregate([
{
$group: {
_id: "$inv_date",
totalCost: {
$sum: {
$multiply: [
"$rate",
"$qty"
]
}
},
avgQty: {
$avg: "$qty"
},
count: {
$sum: 1
}
}
}
])
结果显示字段发票日期的文档已分组,并显示该日期的总成本、平均数量以及开出的发票数量。
$group
关于 MongoDB 中的多个键
以下示例按发票日期分组,然后按项目字段分组,并显示同一日期的总成本、平均数量和发票数量。
db.invoice.aggregate([
{
$group: {
_id: {
inv_date: "$inv_date",
item: "$item"
},
totalCost: {
$sum: {
$multiply: [
"$rate",
"$qty"
]
}
},
avgQty: {
$avg: "$qty"
},
count: {
$sum: 1
}
}
}
])
下面的结果显示发票日期 05/12/2020
和 02/02/2020
的文档具有相同的项目;这两个领域的组合形成了一个群体。
在 MongoDB 中 $group
使用 $match
的多个键
以下示例按发票日期分组,然后按项目字段分组,并显示发票日期为 05/12/2020
的那些单据在同一日期的总成本、平均数量和发票编号。
db.invoice.aggregate([
{
$match: {
inv_date: "05/12/2020"
}
},
{
$group: {
_id: {
inv_date: "$inv_date",
item: "$item"
},
totalCost: {
$sum: {
$multiply: [
"$rate",
"$qty"
]
}
},
avgQty: {
$avg: "$qty"
},
count: {
$sum: 1
}
}
}
])
下面的结果显示发票日期 05/12/2020
的单据有三张发票,但具有相同的项目组合已组成一个组。
MongoDB 中的 $group
区别值
以下聚合操作使用 $group
阶段按项目对文档进行分组,以检索不同的项目值。
db.invoice.aggregate([
{
$group: {
_id: "$item"
}
}
])
输出显示在下面的屏幕截图中。
在 MongoDB 中 $group
阶段对发票日期进行分组
以下聚合操作使用 $group
阶段按项目对文档的发票日期进行分组。
db.invoice.aggregate([
{
$group: {
_id: "$item",
invoiceDate: {
$push: "$inv_date"
}
}
}
])
下面的截图是输出。
本文教你使用 $group
运算符对 MongoDB 文档中存在的多个字段进行分组的最有效方法。
它还讨论了在 MongoDB 中使用运算符的所有多种形式以及与聚合一起使用的运算符列表,以及如何在示例的帮助下实现它们。
相关文章
在 MongoDB Shell 中列出所有数据库
发布时间:2023/05/11 浏览次数:180 分类:MongoDB
-
交互式 Mongo Shell 提供了多个用于获取数据的选项。 本文介绍了在 Mongo Shell 中列出数据库的几种不同方法。
MongoDB 中检查字段包含的字符串
发布时间:2023/05/11 浏览次数:1024 分类:MongoDB
-
这篇文章解决了如何在 MongoDB 中使用正则表达式来确定字段是否包含字符串。在 MongoDB 中使用正则表达式 正则表达式 (regex) 是定义搜索模式的文本字符串。
在 MongoDB 中 upsert 更新插入
发布时间:2023/05/11 浏览次数:214 分类:MongoDB
-
在 MongoDB 中,upsert 结合了更新和插入命令。 它可以在 update() 和 findAndModify() 操作中使用。MongoDB 中的 upsert 查询 upsert 采用单个布尔参数。
如何卸载 MongoDB
发布时间:2023/05/11 浏览次数:745 分类:MongoDB
-
要从您的计算机中卸载 MongoDB,您必须先删除 MongoDB 服务、数据库和日志文件。使用这篇 MongoDB 文章,您将能够从 Ubuntu Linux、Mac 和 Windows 卸载 MongoDB。 请务必保留数据备份,因为一旦卸载,便
在 MongoDB 中存储日期和时间
发布时间:2023/05/11 浏览次数:762 分类:MongoDB
-
本 MongoDB 教程解释了 Date() 对象是什么以及如何使用 Date() 方法对集合进行排序。 这也将帮助您找到在 MongoDB 中显示和存储日期/时间的最佳方法。
MongoDB 按 ID 查找
发布时间:2023/05/11 浏览次数:1856 分类:MongoDB
-
MongoDB 中的 find by Id() 函数用于获取与用户提供的 id 相匹配的文档。 如果找不到与指定 ID 匹配的文档,则返回空值。
检查 MongoDB 服务器是否正在运行
发布时间:2023/05/11 浏览次数:247 分类:MongoDB
-
这篇 MongoDB 教程将告诉您如何检查是否安装了 MongoDB 以及安装的 MongoDB 服务器的版本。 它在 Windows、UBUNTU 和 MAC 等不同的操作系统中实现。
MongoDB 中的分页
发布时间:2023/05/11 浏览次数:174 分类:MongoDB
-
这篇文章将介绍什么是 MongoDB 中的分页。 为什么在 MongoDB 中需要分页以及在 MongoDB 中完成分页的不同方法或方式是什么。
MongoDB 从查询开始
发布时间:2023/05/11 浏览次数:186 分类:MongoDB
-
在这篇 MongoDB 文章中,用户将学习如何使用 $regex 进行开始查询。 它为查询中的模式匹配字符串提供正则表达式功能。