Mongo 聚合多个 $lookup 和 $group

mongodb

1个回答

写回答

2512823394

2025-06-16 17:25

+ 关注

MongoDB
MongoDB

使用Mongo聚合多个$lookup和$group

MongoDB是一个非关系型数据库,提供了丰富的聚合管道操作符,其中包括$lookup和$group。通过结合使用这两个操作符,我们可以实现多个集合的关联和聚合操作。

什么是$lookup操作符?

$lookup是MongoDB聚合管道中的一个操作符,用于将多个集合进行关联。它将在一个集合中查找匹配的文档,并将匹配的结果添加到当前文档中。这使得我们可以在一个查询中获取多个集合的相关数据。

什么是$group操作符?

$group是MongoDB聚合管道中的另一个操作符,用于对文档进行分组。通过指定一个或多个字段作为分组依据,我们可以对文档进行聚合操作,如计算总和、平均值、最大值等。

使用$lookup和$group进行多表关联和聚合

假设我们有两个集合,一个是用户集合(user),包含用户的姓名(name)和所属部门(department)字段;另一个是部门集合(department),包含部门的名称(name)和所属公司(company)字段。我们想要根据用户集合中的部门字段和部门集合中的名称字段进行关联,并计算每个公司的员工数量。

以下是使用$lookup和$group进行多表关联和聚合的代码:

Javascript

db.user.aggregate([

{

$lookup: {

from: "department",

localField: "department",

foreignField: "name",

as: "department_info"

}

},

{

$unwind: "$department_info"

},

{

$group: {

_id: "$department_info.company",

count: { $sum: 1 }

}

}

])

解析代码

首先,我们使用$lookup操作符将用户集合和部门集合进行关联。通过指定from字段为"department",localField字段为"user"集合中的"department"字段,foreignField字段为"department"集合中的"name"字段,我们可以将两个集合关联起来。将关联的结果存储在一个新的字段"department_info"中。

然后,我们使用$unwind操作符展开"department_info"字段。这是因为$lookup操作符返回的结果是一个数组,我们需要展开数组以便进行后续的聚合操作。

最后,我们使用$group操作符按照"department_info.company"字段进行分组,并使用$sum操作符计算每个公司的员工数量。将结果存储在"_id"字段和"count"字段中。

使用案例

假设我们的数据库中有以下数据:

用户集合(user):

Javascript

[

{ name: "Alice", department: "Sales" },

{ name: "Bob", department: "Sales" },

{ name: "Charlie", department: "Marketing" },

{ name: "David", department: "Marketing" },

{ name: "Eve", department: "HR" }

]

部门集合(department):

Javascript

[

{ name: "Sales", company: "ABC Company" },

{ name: "Marketing", company: "ABC Company" },

{ name: "HR", company: "XYZ Company" }

]

运行上述聚合操作后,我们将得到以下结果:

Javascript

[

{ "_id": "ABC Company", "count": 4 },

{ "_id": "XYZ Company", "count": 1 }

]

这表示"ABC Company"公司有4个员工,"XYZ Company"公司有1个员工。

通过结合使用MongoDB的$lookup和$group操作符,我们可以方便地实现多个集合的关联和聚合操作。这使得我们能够更灵活地处理数据,并获得我们所需的结果。

参考资料

- MongoDB Documentation: $lookup - MongoDB.com/manual/reference/operator/aggregation/lookup/">https://docs.MongoDB.com/manual/reference/operator/aggregation/lookup/

- MongoDB Documentation: $group - https://docs.MongoDB.com/manual/reference/operator/aggregation/group/

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号