最近在做一個(gè)仿照微信公眾號(hào)的素材管理的組管理模式,大致效果圖如下:

參考效果
圖片的上傳按照組進(jìn)行分類,在分組管理中,可以展示每個(gè)分組的總資源數(shù)。
我把表壓縮一下后,最簡(jiǎn)單的表結(jié)構(gòu)文檔如下:
分組Group的結(jié)構(gòu)表:
{
"_id":ObjectID("123456789"),
"name":"組名字",
"sort":0 , //排序序號(hào),數(shù)值最高,排序越優(yōu)先
"is_deleted":false //是否已經(jīng)刪除了。
}
資源Resource的結(jié)構(gòu)表:
{
"_id":ObjectID("123456789"),
"name":"資源名字",
"group_id":ObjectID("123456789"), //所屬的組ID
"type":"資源所屬類型,例如:image、video、audio",
"is_deleted":false //是否已經(jīng)刪除了。
}
有時(shí)候,mongodb 之所以強(qiáng)大,正因?yàn)橛辛司酆系拇嬖冢?dāng)希望查詢出每一個(gè)組信息以及每一個(gè)組所對(duì)應(yīng)的資源數(shù)時(shí),只需要利用聚合查詢即可:
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]}, //查詢r(jià)esource 表的is_deleted=false 的記錄
{$eq:['$$group_id','$group_id']}, //$$group_id 表達(dá)的是屬于Group表新建立的字段:group_id,這里意思就是檢查group.group_id = resource.group_id
]
}
}
}
],
as:"resource"
}
},
{
$project:{
name:1,
sort:1,
resource_count:{$size:"$resource"} //通過(guò)$size 來(lái)計(jì)算子文檔的總數(shù)。
}
}
]);