記一次MongoDB 聚合下的聯(lián)表多條件查詢

最近在做一個(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ù)。
                }
            }
        ]);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容