[英]MongoDB: Nested aggregation
我有多个 collections:
用户 - 集合架构
历史是用户集合/文档的子文档
name: "jacob"
_id: 5fc53209e70f776378cce0c5,
history: [
{
_id: 5fc634bee65f96338a63b9e4,
article: 5fc5f3e6140646c2024f7963,
created_at: 2010-12-01T12:19:10.121+00:00
},
{
_id: 5fc634d8e65f96338a63b9e5,
article: 5fc5faaa8b1fffc1f4dec900,
created_at: 2010-12-01T12:19:36.102+00:00
}
]
文章 - 集合架构
{
_id: 5fc5faaa8b1fffc1f4dec900,
title: "hello there",
author: 5fc531cae70f776378cce0c4 // Author is related to user collection
},
{
_id: 5fc5f3e6140646c2024f7963,
title: "hello wonderland",
author: 5fc531cae70f776378cce0c4 // Author is related to user collection
}
是否可以先$lookup
历史中的文章,然后$lookup
文章的作者? 并且还按历史日期排序?
所需 Output
...
name: "jacob",
_id: 5fc53209e70f776378cce0c5,
history: [
{
_id: 5fc634bee65f96338a63b9e4,
article: {
_id: 5fc5faaa8b1fffc1f4dec900,
title: "hello there",
author: {
_id: 5fc531cae70f776378cce0c4,
name: "melissa"
}
},
created_at: 2010-12-01T12:19:10.121+00:00
},
{
_id: 5fc634d8e65f96338a63b9e5,
article: {
_id: 5fc5faaa8b1fffc1f4dec900,
title: "hello wonderland",
author: {
_id: 5fc531cae70f776378ccedsu8,
name: "omelia",
}
},
created_at: 2010-11-12T2:19:36.102+00:00
}
]
注意:按日期降序排列
你可以试试,
$unwind
解构history
数组$lookup
加入文章集合,让传递文章 id,
$match
匹配文章 id$lookup
加入用户集合$unwind
解构 users 因为它的数组$project
显示必填字段$unwind
解构文章数组$sort
按created_at
日期排序$group
by id 并重建history
数组db.users.aggregate([
{ $unwind: "$history" },
{
$lookup: {
from: "articles",
let: { articleId: "$history.article" },
pipeline: [
{ $match: { $expr: { $eq: ["$_id", "$$articleId"] } } },
{
$lookup: {
from: "users",
localField: "author",
foreignField: "_id",
as: "author"
}
},
{ $unwind: "$author" },
{
$project: {
_id: 1,
author: { _id: 1, name: 1 },
title: 1
}
}
],
as: "history.article"
}
},
{ $unwind: "$history.article" },
{ $sort: { "history.created_at": -1 } },
{
$group: {
_id: "$_id",
history: { $push: "$history" },
name: { $first: "$name" }
}
}
])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.