最近在做一个仿照微信公众号的素材管理的组管理模式,大致效果图如下:
参考效果
图片的上传按照组进行分类,在分组管理中,可以展示每个分组的总资源数。
我把表压缩一下后,最简单的表结构文档如下:
分组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 来计算子文档的总数。
}
}
]);