使用 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 中的字段
发布时间:2023/04/21 浏览次数:51 分类:MongoDB
-
在本文中,我们将了解如何比较 MongoDB 中的两个字段。 此外,我们将看到一个相关的示例和解释,以使主题更容易理解。
清除或删除 MongoDB 中的集合
发布时间:2023/04/21 浏览次数:147 分类:MongoDB
-
本篇文章将告诉大家如何删除 MongoDB 数据库中的集合以及删除 MongoDB 中的集合的不同方法。
向 MongoDB 集合中的每个文档添加新字段
发布时间:2023/04/21 浏览次数:107 分类:MongoDB
-
您将在这篇文章中了解 $set 和 $setOnInsert 操作。 此外,利用这两个运算符,快速描述了向 MongoDB 中的集合添加字段的挑战。
MongoDB 截断集合
发布时间:2023/04/21 浏览次数:178 分类:MongoDB
-
可以根据需要选择两个选项之一来截断下面的集合。 在今天的文章中,我们将学习如何在 MongoDB 中截断集合。
删除 MongoDB 中的重复项
发布时间:2023/04/21 浏览次数:151 分类:MongoDB
-
在本文中,我们将了解如何删除 MongoDB 中的重复条目,并且我们还将看到一个带有适当解释的示例,以使主题更容易理解。
使用 NodeJS 检查 MongoDB 中是否存在集合
发布时间:2023/04/21 浏览次数:194 分类:MongoDB
-
在本文中,我们将检查 MongoDB 数据库中是否存在一个集合,并且我们还将查看与主题相关的示例,以使主题更容易理解。 为此,我们将使用 Node.js。
MongoDB 中的唯一索引
发布时间:2023/04/21 浏览次数:144 分类:MongoDB
-
在这篇教学文章中,您将了解唯一索引、它们是什么以及如何在 MongoDB 中使索引唯一。 此外,还简要详细地解释了使用户的电子邮件在 MongoDB 中唯一。
在 MongoDB 中创建索引
发布时间:2023/04/21 浏览次数:104 分类:MongoDB
-
索引有助于有效解决查询。 如果没有索引,MongoDB 必须遍历集合中的每个文档才能找到与查询匹配的文档。因此,在今天的文章中,我们将学习如何在 MongoDB 中创建索引。
MongoDB 中的稀疏索引
发布时间:2023/04/21 浏览次数:142 分类:MongoDB
-
在本文中,我们将讨论 MongoDB 中的稀疏索引。 此外,我们将提供一个相关示例并进行解释,以使该主题更容易理解。