【问题标题】:MongoDB Aggregate not working as expectedMongoDB 聚合未按预期工作
【发布时间】:2020-03-15 12:15:14
【问题描述】:

我试图在图表查找后查找与评论相关的所有投票,但它不起作用。

我正在尝试以递归方式获取线程的 cmets/votes。

我有 3 个架构:

cmets

 - _id
 - points
- content
- userId
- parentId
- parentThreadId

线程

- _id
- upvotes
- downvotes
- title
- content
- userName

投票

- _id
- vote
- commentId
- userId

问题是评论有两个键。一个是“parentId”,另一个是“parentThreadId”。只有当评论是另一个评论的子评论时才会设置 parentId,并且只要它是线程下的顶级评论,就会设置 parentThreadId。

使用此代码,我只收到与顶级评论相关的投票(因此使用 parentThreadId 而不是所有 cmets 的投票)。

        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'
                            }
                        },
                    ]
                  }
             }
        ]).

有人知道如何做到这一点吗?

【问题讨论】:

    标签: javascript mongodb recursion mongoose nosql


    【解决方案1】:

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

    处理此类事情的正确方法是将所有树保存在最顶层的文档中,因此您有线程,您需要将其保存在 cmets 的整个树的一个属性中,这样就可以将管理它的责任转移到 js(它在哪里更容易走过这样的树对象,更新它等)

    【讨论】:

      猜你喜欢
      • 2021-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-16
      • 1970-01-01
      • 2022-10-09
      • 1970-01-01
      相关资源
      最近更新 更多