MongoDB - 使用 $group 在 $lookup 之后倒回 $unwind 嵌套数组

mongodb

1个回答

写回答

lttttttttt

2025-06-14 14:45

+ 关注

MongoDB
MongoDB

MongoDB - 使用 $group 在 $lookup 之后倒回 $unwind 嵌套数组

MongoDB中,我们经常需要处理嵌套数组数据。在某些情况下,我们需要对这些嵌套数组进行聚合操作,并将结果展开以便更好地进行分析。在本文中,我们将探讨如何使用MongoDB的聚合操作符 $group、$lookup 和 $unwind 来处理这种情况。

背景介绍

假设我们有两个集合:用户集合(users)和订单集合(orders)。每个用户都可以拥有多个订单,并且每个订单都包含多个商品。我们想要统计每个用户的订单总金额。

方案

首先,我们需要使用 $lookup 进行左连接操作,将用户集合和订单集合关联起来。这将创建一个新的字段,其中包含了每个用户的订单信息。下面是一个示例代码:

Javascript

db.users.aggregate([

{

$lookup: {

from: "orders",

localField: "_id",

foreignField: "user_id",

as: "orders"

}

}

])

接下来,我们可以使用 $unwind 操作符展开嵌套数组字段。这样一来,每个订单将变成一个独立的文档。下面是一个示例代码:

Javascript

db.users.aggregate([

{

$lookup: {

from: "orders",

localField: "_id",

foreignField: "user_id",

as: "orders"

}

},

{

$unwind: "$orders"

}

])

现在,我们可以使用 $group 操作符对用户进行分组,并计算每个用户的订单总金额。下面是一个示例代码:

Javascript

db.users.aggregate([

{

$lookup: {

from: "orders",

localField: "_id",

foreignField: "user_id",

as: "orders"

}

},

{

$unwind: "$orders"

},

{

$group: {

_id: "$_id",

TotalAmount: { $sum: "$orders.amount" }

}

}

])

案例代码

假设我们有以下的用户集合和订单集合:

用户集合(users):

Javascript

[

{

"_id": 1,

"name": "John"

},

{

"_id": 2,

"name": "Alice"

}

]

订单集合(orders):

Javascript

[

{

"_id": 101,

"user_id": 1,

"amount": 50

},

{

"_id": 102,

"user_id": 1,

"amount": 100

},

{

"_id": 103,

"user_id": 2,

"amount": 75

}

]

我们可以使用以下代码实现上述方案:

Javascript

db.users.aggregate([

{

$lookup: {

from: "orders",

localField: "_id",

foreignField: "user_id",

as: "orders"

}

},

{

$unwind: "$orders"

},

{

$group: {

_id: "$_id",

TotalAmount: { $sum: "$orders.amount" }

}

}

])

运行以上代码将得到以下结果:

Javascript

[

{

"_id": 1,

"TotalAmount": 150

},

{

"_id": 2,

"TotalAmount": 75

}

]

在本文中,我们学习了如何使用MongoDB的聚合操作符 $group、$lookup 和 $unwind 来处理嵌套数组数据。通过将这些操作符结合使用,我们可以轻松地对嵌套数组进行聚合操作,并从中获取有用的信息。

以上是关于MongoDB使用 $group 在 $lookup 之后倒回 $unwind 嵌套数组的文章。希望本文能帮助您理解并使用这些操作符来处理您的数据。

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号