程 程 程序员 2020-03-25 18:03 采纳率: 0%
浏览 2245

mongoDB 多表联查 关联多个字段

最新来的项目上了个mongodb数据库,然后我负责的部分涉及到了多表联查。
问题来了,多表联查的时候,表A.a字段 需要关联 表B.a, B.c两个字段,而 $lookup: 只能关联一个字段,本来mongodb就不是很熟,这下给我难住了。
原mysql语句是这样的(mysql多好,又简单又方便)

SELECT
    * 
FROM
    fsoc_host_info h
    LEFT JOIN fsoc_device_info d ON h.host_ip = d.enter_host 
    OR host_ip = d.out_host 
WHERE
    d.type IN ( "Door", "Gate", "Barrier" )

下面会附上mongodb的语句与数据

db.HostInfo.insert(//新增
{host_id : 3,host_ip : "10.0.60.102",host_name : "DH-ASI1212A(V2)",host_port : 37777,host_user : "admin",host_password : "123456",host_type : "2",host_is_defense : 1},
{host_id : 3,host_ip : "10.0.60.103",host_name : "DH-ASI1212A(V2)",host_port : 37777,host_user : "admin",host_password : "123456",host_type : "2",host_is_defense : 1})



db.DeviceInfo.insert(
{device_id : 1,region_id : 2,name : "研发部门闸",type : "Gate",enter_host : "10.0.60.98",out_host : "10.0.60.99",enter_channel : 0,out_channel : 0, company : "DAHUA",bind_gate_id:1,time_stamp:"2020-03-24 17:07:33"},
{device_id : 2,region_id : 2,name : "研发部门禁",type : "Door",enter_host : "10.0.60.100",out_host : "10.0.60.100",enter_channel : 0,out_channel : 0, company : "DAHUA",bind_gate_id:1,time_stamp:"2020-03-24 17:07:35"});

// 高级聚合框架 
db.HostInfo.aggregate([ //HostInfo 主表
    {
        $lookup: 
        {
            from: "DeviceInfo", //从表
            localField: "host_ip", //主表关联字段
            foreignField: "enter_host", //从表关联字段
            as: "aaa"           //为输出文档的新增值命名(值为关联的从表数据)
        }
    },
        {
         $unwind:'$aaa'
    },
//      {
//               $match : {"aaa" : { $ne: [] } }    //关联的从表数据 aaa 不为空  $matc相当于where条件
//      },
//      {
//               $match : {host_name : "DH-ASG2910Z" } //主表筛选条件
//      },
//      {
//               $match : {"aaa.type" : "Gate"}  //从表筛选条件
//      },
//      {
//        $project: {//指定从表输出字段  指定后主表字段不输出
//           host_ip: "$aaa.enter_host"
//        }
//    },
])


db.HostInfo.aggregate([ //单表查询
    {
//      {
//                  $match: {host_ip: { $in: ['10.0.60.99','10.0.60.98',"10.0.60.100"] } } //host_ip = 60.98 或 60.99 or 60.100   in
//      },
    $match: { $or: [{ host_ip: '10.0.60.98' }, { host_ip: '10.0.60.99' }] }//or 
    }
]);

球球各位大佬给指点一下,mongoDB 多表联查,同时表A一个字段,关联表B的两个字段要怎么写出对应的语句。

球球各位大佬给指点一下,mongoDB 多表联查,同时表A一个字段,关联表B的两个字段要怎么写出对应的语句。

  • 写回答

1条回答 默认 最新

  • 23du幽蓝心境 2020-04-03 15:07
    关注

    参考:https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/#lookup-join-pipeline

    db.HostInfo.aggregate([ //HostInfo 主表
        {
            $lookup: 
            {
                from: "DeviceInfo", //从表
                            "let": {
                        "host_ip ": "$host_ip "
                    },
                     "pipeline": [
                     { $match: 
                         { $expr: {
                                            $or: [ { $eq: ["$enter_host ","$$host_ip" ] },  { $eq: ["$out_host ","$$host_ip" ] } ]
                                            }
                                            }
                                        }
                                    ],
                as: "aaa"           //为输出文档的新增值命名(值为关联的从表数据)
            }
        }
        ])
    
    评论

报告相同问题?

悬赏问题

  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况
  • ¥15 画两个图 python或R