小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

表單生成器(Form Builder)之mongodb表單數(shù)據(jù)查詢——關(guān)聯(lián)查詢

 Coder編程 2022-05-02 發(fā)布于北京

  這一篇接著記錄一下查詢相關(guān)的操作。想象一下,如果想要在一張表格中展示某些車輛的耗損和營收情況,我們該怎么處理。車輛、耗損、營收各自存儲在一張表中,耗損和營收中冗余了車輛信息……我們便想到了關(guān)聯(lián)查詢。mongodb 3.2+中開始支持關(guān)聯(lián)查詢,下面介紹一下寫關(guān)聯(lián)查詢的過程。

  測試一、

db.getCollection('FormInstace').aggregate([
    {
        $match: {
            "FormItems.key": { $ne: null }
        }
    },
    {
        $addFields: {
            FormValueObj: {
                $arrayToObject: {
                    $map: {
                        input: "$FormItems",
                        as: "field",
                        in: [ "$$field.key", "$$field.value" ]
                    }
                }
            }
        }
    },
    {
      $replaceRoot: { newRoot: { $mergeObjects: [ "$FormValueObj", "$$ROOT" ] } }
    },
    {
        $project: {
            FormItems:0,
            FormValueObj:0
        }
    },
    { 
        $lookup:{
            from:"FormInstace",
            localField:'_id',
            foreignField:'FormItems.value.id',
            as:'RelationData'
        } 
    }
]);

  結(jié)合前面筆記的成果和官方文檔寫了第一個關(guān)聯(lián)查詢,這次查詢跑了300s直接累死了,于是我便介紹了一下數(shù)量。

  測試二、

db.getCollection('FormInstace').aggregate([
    {
        $match: {
            "_id":{$in:["1","2","3"]},
            "FormItems.key": { $ne: null }
        }
    },
    {
        $addFields: {
            FormValueObj: {
                $arrayToObject: {
                    $map: {
                        input: "$FormItems",
                        as: "field",
                        in: [ "$$field.key", "$$field.value" ]
                    }
                }
            }
        }
    },
    {
      $replaceRoot: { newRoot: { $mergeObjects: [ "$FormValueObj", "$$ROOT" ] } }
    },
    {
        $project: {
            FormItems:0,
            FormValueObj:0
        }
    },
    { 
        $lookup:{
            from:"FormInstace",
            localField:'_id',
            foreignField:'FormItems.value.id',
            as:'RelationData'
        } 
    }
]);

  這次總算沒有報錯,但是耗時也夠長的(十多秒);關(guān)聯(lián)數(shù)據(jù)(RelationData)確實是查出來了,但是該數(shù)組中的關(guān)聯(lián)數(shù)據(jù)還是原來的數(shù)據(jù)結(jié)構(gòu)。那么我們是不是同樣可以將關(guān)聯(lián)數(shù)據(jù)中的表單項的值也放到最外層,答案是可以的。

  測試三、

db.getCollection('FormInstace').aggregate([
    {
        $match: {
            "_id":{$in:["1","2","3"]},
            "FormItems.key": { $ne: null }
        }
    },
    {
        $addFields: {
            FormValueObj: {
                $arrayToObject: {
                    $map: {
                        input: "$FormItems",
                        as: "field",
                        in: [ "$$field.key", "$$field.value" ]
                    }
                }
            }
        }
    },
    {
      $replaceRoot: { newRoot: { $mergeObjects: [ "$FormValueObj", "$$ROOT" ] } }
    },
    {
        $project: {
            FormItems:0,
            FormValueObj:0
        }
    },
    { 
        $lookup:{
            from:"FormInstace",
            localField:'_id',
            foreignField:'FormItems.value.id',
            as:'RelationData'
        } 
    },
    {
        $addFields:{
            RelationData:{
                 $map:
                 {
                    input: "$RelationData",
                    as: "tr",
                    in: {
                        $arrayToObject:{
                            $map:
                             {
                               input:{ 
                                   $concatArrays: [ 
                                   [    
                                        {key:"_id",value:"$$tr._id"},
                                        {key:"ExtendData",value:"$$tr.ExtendData"},
                                        {key:"CreateUserId",value:"$$tr.CreateUserId"},
                                        {key:"CreateUserName",value:"$$tr.CreateUserName"},
                                        {key:"CreateDate",value:"$$tr.CreateDate"},
                                        {key:"LastModifyDate",value:"$$tr.LastModifyDate"},
                                        {key:"FormId",value:"$$tr.FormId"},
                                        {key:"FormVersion",value:"$$tr.FormVersion"},
                                   ], 
                                   "$$tr.FormItems" ] 
                               },
                               as: "field",
                               in: ["$$field.key","$$field.value"]
                            }
                        }
                    }
                 }
            }
        }
    }
]);

  這個查詢得到了我們想要的效果,但是這個關(guān)聯(lián)查詢太費勁了,不單是代碼一大推,并且還要處理關(guān)聯(lián)數(shù)據(jù)(RelationData)的結(jié)構(gòu)……因為所有的數(shù)據(jù)都放在同一張表中,之前我們處理過這張表,現(xiàn)在還要處理一遍,不太情愿

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多