MongoDB聚合无法正常工作

时间:2019-11-19 21:35:23

标签: javascript mongodb recursion mongoose nosql

我正在尝试在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'
                            }
                        },
                    ]
                  }
             }
        ]).

有人知道如何实现这一目标吗?

1 个答案:

答案 0 :(得分:0)

不久前,我遇到了类似的问题,您在一个集合中的文档之间存在递归关系,可悲的是,获取所有注释树的唯一方法是递归地为每个子级别的注释提出请求。

处理此类问题的正确方法是将所有树都保存在最顶层的文档中,因此您拥有线程,您需要将整个注释树保存在一个属性中,以这种方式将管理责任转移到js(在这种情况下更容易遍历此类树对象,对其进行更新等)