在写自己的博客项目的时候遇到了一个问题,已经纠缠我两天了,也查了很多,官方文档也看了,但并没有找到结果,只能发到这里看看有没有朋友知道的
技术栈
- nestjs
- mongoose
- typegoose
先介绍一下主要问题的几张表
介绍
-
用户表
其中我们主要用到的是用户的id,在关联这一块 -
评论表
这是评论表的字段,问题出在了子集中,稍后会详细介绍 -
文章表
这个表就是我做关联查询的表,也就是在这个表里查询评论的时候遇到了的问题
问题描述
就是在这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
,
但就是在使用这个递归查询的时候我遇到了一个问题,就是在递归查询的过程中如何在进行左连接。
因为我需要将子集的用户信息也都查询到,可是查遍文档也没有找到合适的方法,不知是有另一种方式还是说我本身想法就写错了
可以看到上图中,我的二级评论的用户信息都只是id查询不到,但是我最上级评论的用户信息是可以查询到的。
希望了解的的朋友帮忙看看是否是有其他的解决方式,多谢!