[问题] MongoDB中多表关联遇到了问题

在写自己的博客项目的时候遇到了一个问题,已经纠缠我两天了,也查了很多,官方文档也看了,但并没有找到结果,只能发到这里看看有没有朋友知道的

技术栈

  • nestjs
  • mongoose
  • typegoose

先介绍一下主要问题的几张表

介绍

  1. 用户表
    image.png
    其中我们主要用到的是用户的id,在关联这一块

  2. 评论表
    image.png
    这是评论表的字段,问题出在了子集中,稍后会详细介绍

  3. 文章表

image.png
这个表就是我做关联查询的表,也就是在这个表里查询评论的时候遇到了的问题

问题描述

就是在这3张表做关联查询的时候遇到了问题,评论表中主要字段是parent,用来存储上级评论,object_id表示的是评论的是哪一个文章id,因为我想到评论可以一直嵌套回复下去,所以肯定是要用到递归聚合的。下面是我写的递归查询评论的代码

  // 注意:this.model是指 article 这个集合
  await this.model.aggregate([
      {
        $lookup: {
          from: 'comments',
          localField: '_id',
          foreignField: 'object_id',
          as: 'comments',
          pipeline: [
            {
              $match: {
                parent: null,
              },
            },
            {
              $graphLookup: {
                from: 'comments',
                startWith: '$_id',
                connectFromField: '_id',
                connectToField: 'parent',
                as: 'children',
                depthField: 'depth',
              },
            },
            // 查询评论用户
            {
              $lookup: {
                from: 'users',
                localField: 'user',
                foreignField: '_id',
                as: 'user',
              },
            },
            // 结构
            {
              $unwind: '$user',
            },
          ],
        },
      },
      // 合并到 article 其他查询内容中(忽略)
      {
        $merge: {
          into: 'articles',
          on: '_id',
          whenNotMatched: 'insert',
        },
      },
    ]);

我的想法就是,首先在文章查询的时候使用左连接关联查询到评论。

然后使用pipeline管道里把查询到的数据先进行一次筛选,只要最上级评论的,然后再去使用递归聚合(这里主要是因为评论可以嵌套)所以我是使用的$graphLookup

但就是在使用这个递归查询的时候我遇到了一个问题,就是在递归查询的过程中如何在进行左连接。

因为我需要将子集的用户信息也都查询到,可是查遍文档也没有找到合适的方法,不知是有另一种方式还是说我本身想法就写错了

image.png

可以看到上图中,我的二级评论的用户信息都只是id查询不到,但是我最上级评论的用户信息是可以查询到的。

希望了解的的朋友帮忙看看是否是有其他的解决方式,多谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值