最新来的项目上了个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的两个字段要怎么写出对应的语句。
参考: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" //为输出文档的新增值命名(值为关联的从表数据)
}
}
])