mongodb联表查询

//多表联查
db.TABLE_NAME.aggregate([
    {
        $lookup:{//连表
            from:'table0',    //被关联的表名
            localField:'localField',    //关联标识符    主动关联的表
            foreignField:'foreignField',    //关联标识符    被关联的表
            as:'table0'        //被关联的表的别名,下面涉及到被关联的表的操作,都用这个
        }
    },
    {
        $unwind:'$table0'//扁平化,将数组数据拆分    被关联的表
    },
    {
        $match:{<query>}//正常查询
        $match:{'or':[<query>,<query>]}//多条件查询    或
    },
    {
        $project:{                //要显示的字段
            '_id':0,    //_id
            'F1':'$table.f1',//取别称    主动关联的表的数据
            'F2':'$table0.f2',    被关联的表的数据
            'F3':{//case when
                $cond:{if:{$gte:['$f3',30]},then:0,else:50}
            }
        }
    },
]).forEach(function(item)){    //遍历    对多表联查出来的数据做操作    一般创建新表
    db.aaaa.insert(item);    //创建新表
}

 

案例:

    打分卡数据库
1.联表查询与创建新表
var ls = [];
db.score_record_r.aggregate([
    {
        '$lookup':{
            'from':'score_parameter_r',
            'localField':'_id',
            'foreignField':'_id',
            'as':'score_parameter_r'
        }
    },
    {'$unwind':'$score_parameter_r'},
    {'$match':{'score_parameter_r.score_parameter.eva1_result':{$in:['shdtax','shdYLian']}}},
    {
        '$project':{
            '_id':'$_id',
            'eva1_result':'$score_parameter_r.score_parameter.eva1_result',
            'name':'$score_record.i2',
            'idno':'$score_record.i3'
         }
     }
]).forEach(function(item){
    var insert = true;
    if(ls.indexOf(item.idno)<0){
        ls.push(item.idno);
    }else{
        insert = false;
    }
    if(insert){
        var history = db.tmp0812.findOne({'idno':item.idno});
        if(history&&history.idno){insert = false;}
    }
    insert&&(db.tmp0812.insert(item))
})

2.检验新表
db.tmp0812.find()

3.导出新表
./mongoexport --port 47017 -u root -p root --authenticationDatabase admin -d ruleCard-1211 -c tmp0812 -o tmp0812.json --type json

-d表示数据库;-c表示数据表;-f需要提取的field,用逗号隔开;--q 导出条件  --o输出路径  --type  数据类型




    信贷工厂数据库
1.导入新表
./mongoimport --port 29034 -u urcbfzd -p urcbfzd --authenticationDatabase admin -d xdgcdb -c tmp0812 --type json --file tmp0812.json
    
-d表示数据库;-c表示数据表;-f需要提取的field,用逗号隔开;--q 导出条件  --o输出路径  --type  数据类型

2.联表查询
db.tmp0812.aggregate([
    {
        '$lookup':{
            'from':'customer_info',
            'localField':'idno',
            'foreignField':'customer_info.d1',
            'as':'customer_info'
        }
    },
    {'$unwind':'$customer_info'},
    {
        '$project':{
            '_id':'$_id',
            'eva1_result':'$eva1_result',
            'name':'$name',
            'idno':'$idno',
            'phone':'$customer_info.customer_info.d',
            'merLicense':{
                '$ifNull':[
                    '$customer_info.customer_info.i1_content.businessCertNo',
                    '$customer_info.shd_isStock.merLicense'
                ]
            },
            'merName':{
                '$ifNull':[
                    '$customer_info.customer_info.i1_content.businessName',
                    '$customer_info.shd_isStock.merName'
                ]
             }
        }
     }
]).forEach(function(item){
    db.tmp0813.insert(item)  
})

3.检验新表
db.tmp0813.find()

3.导出新表
./mongoexport --port 29034 -u urcbfzd -p urcbfzd --authenticationDatabase admin -d xdgcdb -c tmp0813 -f "eva1_result,name,idno,phone,merLicense,merName" -o tmp0813.csv --type csv


-d表示数据库;-c表示数据表;-f需要提取的field,用逗号隔开;--q 导出条件  --o输出路径  --type  数据类型


posted @ 2021-08-13 15:00  白云之间  阅读(1063)  评论(0编辑  收藏  举报