当前位置:首页 > 行业动态 > 正文

mongodb中非常好用的Aggregate入门教程

MongoDB聚合操作入门教程:详解Aggregate命令,包括分组、筛选、排序等操作,实例演示如何进行复杂的数据拆分与查询。适合初学者快速掌握MongoDB数据处理技巧。

《MongoDB Aggregate管道:从入门到实战》

MongoDB Aggregate简介

MongoDB Aggregate管道是一个基于数据处理流水线的框架,它允许用户对集合中的数据进行分组、转换和计算等操作,Aggregate管道提供了一个类似于SQL中GROUP BY和JOIN的功能,可以帮助我们解决复杂的数据处理问题。

Aggregate管道的主要阶段

1、$match:筛选符合条件的文档。

2、$group:将集合中的文档分组,可用于计算总和、平均数、最大值、最小值等。

3、$sort:对输入的文档进行排序。

4、$project:选择、添加或删除文档的字段。

5、$lookup:执行左外连接,以另一个集合作为右表,类似于SQL中的JOIN。

6、$unwind:将数组字段中的每个元素拆分为单独的文档。

7、$limit:限制聚合管道返回的文档数。

8、$skip:在聚合管道中跳过指定数量的文档。

9、$out:将聚合管道的结果输出到指定的集合。

入门示例

1、$match示例

假设有一个名为“orders”的集合,包含以下文档:

{
  "_id": 1,
  "status": "A",
  "amount": 100
}
{
  "_id": 2,
  "status": "A",
  "amount": 200
}
{
  "_id": 3,
  "status": "D",
  "amount": 300
}

使用$match阶段筛选出状态为“A”的订单:

db.orders.aggregate([
  { $match: { status: "A" } }
])

2、$group示例

计算状态为“A”的订单的总金额:

db.orders.aggregate([
  { $match: { status: "A" } },
  { $group: { _id: null, totalAmount: { $sum: "$amount" } } }
])

3、$sort示例

将订单按照金额升序排序:

db.orders.aggregate([
  { $sort: { amount: 1 } }
])

4、$project示例

选择订单的_id、status和amount字段,同时计算每个订单的税额(假设税率为10%):

db.orders.aggregate([
  { $project: { _id: 1, status: 1, amount: 1, tax: { $multiply: ["$amount", 0.1] } } }
])

5、$lookup示例

假设有一个名为“customers”的集合,包含以下文档:

{
  "_id": 1,
  "name": "Alice",
  "orderno": "A123"
}
{
  "_id": 2,
  "name": "Bob",
  "orderno": "B123"
}

现在我们希望将“orders”集合中的订单与“customers”集合中的客户信息进行关联:

db.orders.aggregate([
  {
    $lookup: {
      from: "customers",
      localField: "orderno",
      foreignField: "orderno",
      as: "customer"
    }
  }
])

6、$unwind示例

假设有一个名为“inventory”的集合,包含以下文档:

{
  "_id": 1,
  "sku": "abc123",
  "sizes": ["S", "M", "L"]
}

使用$unwind将sizes数组中的每个元素拆分为单独的文档:

db.inventory.aggregate([
  { $unwind: "$sizes" }
])

实战示例

假设我们有一个电商平台的订单数据,我们需要计算每个客户的总消费金额。

1、创建订单集合“orders”:

{
  "_id": 1,
  "customer_id": 1,
  "amount": 100
}
{
  "_id": 2,
  "customer_id": 2,
  "amount": 200
}
{
  "_id": 3,
  "customer_id": 1,
  "amount": 300
}

2、使用Aggregate管道计算每个客户的总消费金额:

db.orders.aggregate([
  { $group: { _id: "$customer_id", totalAmount: { $sum: "$amount" } } },
  { $sort: { totalAmount: -1 } }
])

3、输出结果:

{ "_id": 1, "totalAmount": 400 }
{ "_id": 2, "totalAmount": 200 }

通过以上示例,我们可以看到MongoDB Aggregate管道在处理复杂的数据聚合问题时非常灵活和强大,掌握Aggregate管道,可以帮助我们更高效地处理数据,满足各种业务需求。

0