我正在尝试在graphlookup之后查找与评论相关的所有投票,但是它不起作用。
我正在尝试递归获取线程的注释/投票。
我有3种模式:
评论
- _id
- points
- content
- userId
- parentId
- parentThreadId
线程
- _id
- upvotes
- downvotes
- title
- content
- userName
投票
- _id
- vote
- commentId
- userId
问题在于注释有两个键。一个是“ parentId”,另一个是“ parentThreadId”。仅当注释是另一个注释的子项时才设置parentId,并且只要注释是线程下的顶级注释,就设置parentThreadId。
使用此代码,我只会收到与顶级注释关联的投票(因此具有parentThreadId而不是所有注释的投票)。
const threadId = req.params.id;
const ObjectId = mongoose.Types.ObjectId;
Thread.aggregate([
{
$match: {_id : ObjectId(threadId)}
},
{
$lookup:
{
from: 'comments',
as: 'comments',
pipeline: [
{
$match: {parentThreadId : ObjectId(threadId)}
},
{
$graphLookup: {
from: "comments",
startWith: "$_id",
connectFromField: "_id",
connectToField: "parentId",
as: "children",
depthField: "level",
}
},
{
$lookup :
{
from: 'votes',
localField: '_id',
foreignField: 'commentId',
as: 'votes'
}
},
]
}
}
]).
有人知道如何实现这一目标吗?
答案 0 :(得分:0)
不久前,我遇到了类似的问题,您在一个集合中的文档之间存在递归关系,可悲的是,获取所有注释树的唯一方法是递归地为每个子级别的注释提出请求。
处理此类问题的正确方法是将所有树都保存在最顶层的文档中,因此您拥有线程,您需要将整个注释树保存在一个属性中,以这种方式将管理责任转移到js(在这种情况下更容易遍历此类树对象,对其进行更新等)