mongodb聚合中对喜欢的文档进行循环



我有一个带有两个文档的集合,其中有一个字段引用了下一个文档。例如

模式

const books = new mongoose.Schema({
_id: { type: String, index: true, required: true, default: () => nanoid() }
title: { type: String },
nextBook: { type: String, ref: 'books' } 
(..)
})

文件

const books = [
{ 
_id: '1',
title: 'book type A Edition 1',
nextBook: '2'
},
{ 
_id: '2',
title: 'book type A Edition 2',
nextBook: '3'
},
{ 
_id: '3',
title: 'book type A Edition 3',
},
]

现在,在一个聚合中,例如id为1的文档,我想在文档上循环,由nextBook字段引用,直到nextBook未定义(它是最后一本书(,并将文档返回为";lastBook">

我怎样才能做到这一点;循环"?

向致意

您必须使用聚合管道和$graphLookup递归地获取所有链接的图书,然后为每本书选择最后一本。像这样:

db.collection.aggregate([
{
$graphLookup: {
from: "collection",
startWith: "$nextBook",
connectFromField: "nextBook",
connectToField: "_id",
as: "nextBooks"
}
},
{
"$unwind": "$nextBooks"
},
{
"$sort": {
"nextBooks._id": 1
}
},
{
"$group": {
"_id": "$_id",
"nextBooks": {
"$push": "$nextBooks"
}
}
},
{
"$addFields": {
"lastBook": {
"$cond": {
"if": {
"$eq": [
{
"$size": "$nextBooks"
},
0
]
},
"then": null,
"else": {
"$last": "$nextBooks"
}
}
}
}
},
{
"$project": {
lastBook: 1
}
}
])

这是操场链接。

最新更新