记一次MongoDB 聚合下的联表多条件查询

最近在做一个仿照微信公众号的素材管理的组管理模式,大致效果图如下:


参考效果

图片的上传按照组进行分类,在分组管理中,可以展示每个分组的总资源数。
我把表压缩一下后,最简单的表结构文档如下:

分组Group的结构表:
{
  "_id":ObjectID("123456789"),
  "name":"组名字",
  "sort":0 ,       //排序序号,数值最高,排序越优先
  "is_deleted":false          //是否已经删除了。
}
资源Resource的结构表:
{
  "_id":ObjectID("123456789"),
  "name":"资源名字",
  "group_id":ObjectID("123456789"),    //所属的组ID
  "type":"资源所属类型,例如:image、video、audio",
  "is_deleted":false          //是否已经删除了。
}

有时候,mongodb 之所以强大,正因为有了聚合的存在,当希望查询出每一个组信息以及每一个组所对应的资源数时,只需要利用聚合查询即可:

const result = await db.getCollection("group").aggregate([
            {
                $match:{
                    is_deleted:false
                },
            },
            {
                $project:{
                    name:1,
                    sort:1,
                },
            },
            {
                $sort:{sort:-1}
            },
            {
                $lookup:{
                    from:"resource",
                    let:{ group_id: "$_id" },  //把group表的_id定义成group_id字段里
                    pipeline:[
                        {
                            $match:{
                                $expr:{
                                    $and:[
                                        {$eq:['$is_deleted',false]},     //查询resource 表的is_deleted=false 的记录
                                        {$eq:['$$group_id','$group_id']}, //$$group_id 表达的是属于Group表新建立的字段:group_id,这里意思就是检查group.group_id = resource.group_id
                                    ]
                                }
                            }
                        }
                    ],
                    as:"resource"
                }
            },
            {
                $project:{
                    name:1,
                    sort:1,
                    resource_count:{$size:"$resource"}    //通过$size 来计算子文档的总数。
                }
            }
        ]);
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容